参考实验5-2,设计一个菜单,在屏幕显示一个任务提示的选择菜单,用户通过输入1-6进入其中一个任务,任务完成后继续显示任务提示界面,若用户输入0,则退出系统。
注意,任务1有两种方法,所以输入选项1后,还需要再次提示用户选用break语句还是设置标志标量的方法来判断m是否是素数。
任务1:
用试商法判断某个数是否是素数。要求:采用试商法,分别用break语句和采用设置标志变量并加强循环测试(即在for循环的表达式中判断标志的值,若检测到标志为非素数,终止循环)这两种方法,分别编写函数isPrime1()和isPrime2(),从键盘任意输入一个整数m,判断m是否为素数,如果m是素数,按照”%d is a prime number\n”的格式打印,否则按”%d is not a prime number\n”格式打印。然后思考分析那种方法的可读性好。
任务2:
用数学的方法可以证明,不能被2~sqrt(m)(取整)之间的数整除的数,一定不能被1和它本身之外的任何整数整除。根据素数的这个性质,通过编写新的素数判断函数isPrime3(),完成素数的判断。
任务3:
从键盘任意输入一个整数n,编程计算并输出1~n之间的所有素数之和。
任务4:
从键盘任意输入一个整数m,若m不是素数,这计算并输出其所有因子(不包括1),例如对于16,输出2,4,8;否则输出”No divisor , It is a prime number”。
任务5:
如果一个正整数m的所有小于m的不同因子(包括1)加起来正好等于m本身,那么就称它为完全数,例如,6就是一个完全数,是因为6=1+2+3。请编写一个判断完全数的函数,isPerfect(),然后判断从键盘输入的整数是否是完全数。
任务6:
从键盘任意输入一个整数m,若m不是素数,则对m进行质因数分解(质因数:其既是质数(即素数),也是m的因子数。质因数分解,就是分解出来的因数也是质数),并将m以质因数从小到大顺序排列的乘积形式输出,否则输出“It is a prime number”。例如用户输入90,程序输出90=233*5;用户输入17时,程序输出“It is a prime number”。
分析:确实跟上周的实验课作业很像,不论是题目还是代码。为了完全满足题意(也为了少动脑子想怎么压行、美化代码),要求定义多个函数的地方尽管有很大重复度也还是分开写了,没有要求写函数的地方就写在了main函数里面弄成一坨
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int isPrime1(int m)
{
int i;
for(i=2;i<m;++i)
if(m%i==0)
return 0;
return 1;
}
int isPrime2(int m)
{
int i,flag=1;
for(i=2;i<m;++i)
if(m%i==0)
flag=0;
return flag;
}
int isPrime3(int m)
{
if(m==2 || m==3)return 1;
int i,emp=sqrt(m);
for(i=2;i<=emp;++i)
if(m%i==0)
return 0;
return 1;
}
int op(int in,int m)
{
if(m==1)return 0;
if(in==1)return isPrime1(m);
else return isPrime2(m);
}
int isPerfect(int m)
{
int i,sum=1;
for(i=2;i<m;++i)
if(m%i==0)
sum+=i;
return sum==m;
}
int main()
{
int m,i,in,sum,flag,emp;
do
{
printf("任务1: 试商法判断某个数是否是素数\n");
printf("任务2: 根号法判断某个数是否是素数\n");
printf("任务3: 计算并输出1~n之间的所有素数之和\n");
printf("任务4: 输出非素数所有因子\n");
printf("任务5: 判断完全数\n");
printf("任务6: 非素数的质因数分解\n");
printf("请通过输入1-6选择所执行的任务,输入0退出:\n");
scanf("%d",&in);
switch(in)
{
case 0:break;
case 1:
printf("方法1break语句;方法2设置标志标量\n请输入1或2选择所用方法");
scanf("%d",&in);
while(in!=1 && in!=2){puts("Inputs error! Please input again: ");scanf("%d",&in);}
printf("please input the number ");
scanf("%d",&m);
printf("%d is ",m);
if(!op(in,m))
printf("not ");
puts("a prime number");
break;
case 2:
printf("please input the number ");
scanf("%d",&m);
printf("%d is ",m);
if(!isPrime3(m))
printf("not ");
puts("a prime number");
break;
case 3:
sum=0;
printf("please input the number ");
scanf("%d",&m);
for(i=2;i<m;++i)
if(isPrime3(i))
sum+=i;
printf("%d\n",sum);
break;
case 4:
printf("please input the number ");
scanf("%d",&m);
flag=1;
for(i=2;i<m;++i)
if(m%i==0)
{
printf("%d ",i);
flag=0;
}
if(flag)printf("No divisor , It is a prime number");
puts("");
break;
case 5:
printf("please input the number ");
scanf("%d",&m);
printf("%d is ",m);
if(!isPerfect(m))printf("not ");
puts("a perfect number");
break;
case 6:
printf("please input the number ");
scanf("%d",&m);
if(isPrime3(m))
{
puts("It is a prime number");
break;
}
printf("%d=",m);
emp=sqrt(m);
for(i=2;i<=emp;++i)
while(m%i==0)
{
printf("%d",i);
if((m/=i)!=1)
printf("*");
}
puts("");
break;
default:puts("Input error!");
}
}while(in);
return 0;
}
|
请发表评论