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多余的字符: