欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言 把一个数分解成两个素数的和,判断素数精简算法,scanf("%c")读入的是回车符‘\n’

程序员文章站 2024-02-03 16:53:28
...
/**
把一个数分解成两个素数的和
*/
#include<stdio.h>
#include<math.h>
void main()
{
    int n;
    char doagain='n';
    char temp;
    do
    {
        printf("输入一个数:");
        scanf("%d",&n);
        int i;
        int count=0;
        for(i=1;i<n;i++)
        {
            if(isPrime(i)&&isPrime(n-i))//如果返回1表示 i是质数,如果两个数都是质数
            {
                printf("%d=%d+%d\n",n,i,n-i);
                count++;
            }
        }
        if(count==0)
        {
            printf("%d无法分解成两个质数的和式\n",n);
        }
        printf("继续[y/n]?:");
//        scanf("%s",&doagain);//这样是可以的
//        scanf("%c",&doagain);//这样无法循环,因为读入的字符其实是回车符,不满足循环条件,所以循环结束
        scanf("%c%c",&temp,&doagain);//这样就可循环了,读入第一个的字符是回车,接着才读到控制字符[y|n]
        printf("第一个字符是回车?%d\n",(temp=='\n'));//输出1:表示真的是回车符
        printf("多余的字符:%c",temp);//打印了一个回车
/*
    这里总结:如果使用字符作为循环控制符,会多读入一个回车符‘\n’(使用%c%c),
        第一个%c读入回车符,第二个%c读入的才是循环控制符
    或者使用%s,就可以这个问题
*/
    }while((doagain=='y')||(doagain=='Y'));

}
int isPrime(int n)//判断一个数是不是质数
{
    int i;
    if(n<2)
        return 0;
    for(i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)//如果n被其他书整除
            return 0;//那就不是质数,返回0表示不是质数
    }
    return 1;
}

测试:

输入一个数:12
12=5+7
12=7+5
继续[y/n]?:y
第一个字符是回车?1多余的字符:
输入一个数:34
34=3+31
34=5+29
34=11+23
34=17+17
34=23+11
34=29+5
34=31+3
继续[y/n]?:n
第一个字符是回车?1多余的字符: