11.5C语言程序设计作业

参考实验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;
}
posted @ 2020-11-05 11:21  快乐永恒  阅读(512)  评论(3编辑  收藏  举报