#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, p, q; //n 是偶数,并将它分成 p,q
int flagp, flagq, j; //p,q 为素数时,flag = 1; j在循环时使用
p = 1; //之所以不让 p = 0;是因为 1 不是素数,编程完毕之后可以比较一下两者的区别
//输入一个偶数 n
printf("请输入一个偶数:"); //提示输入
scanf("%d", &n); //输入 n
//判断 n 是否为偶数,且大于3
if (n<4 || n%2!=0) //或者n % 2 == 1; 但不要写成赋值 =
{
printf("Input data error!\n"); //提示输入错误
exit(-1); //程序结束。添加 #include<stdlib.h>
}
//判断 p,q 是否是素数
do{
p++; //此时 p 从 2 开始循环
q = n-p;
flagp = 1; //假设 p 是素数
//判断 p 是否为素数
for (j=2; j <= sqrt(p); j++) //sqrt();函数是求一个数的平方根,添加 #include<math.h>
{
if(0 == p % j) //素数的因数只有 1 和它本身
{
flagp = 0; //不是素数,改变 flagp 的值
break; //退出 for 循环
}
}
flagq = 1;
//判断 q 是否为素数
for (j=2; j <= sqrt(q); j++)
{
if(0 == q % j)
/*不写成 q % j == 0; 是因为 0 == q % j 中,如果 == 写成 = ,会变成bug,可以报错*/
{
flagq = 0;
break;
}
}
} while(flagq * flagp == 0); //首先 flag = 1,否则 do while 循环无法结束
//输出 n, p. q
printf(" n = p + q\n");
printf("%4d =%4d +%4d\n", n, p, q);
return 0;
}
下面进行编程时的错误总结:
(1)一开始令 flagq 和 flagq 等于0,然后 q,p 不为素数时,flag = 1;
因为while(flagq * flagp == 0);所以如果两个数为素数,循环还会继续,无法退出循环。
正确的写法:先 flag = 1; 若不是素数,则 flag = 0;只要 p,q 中有一个不是素数,则循环继续。
(2)一开始令 p = 0;
那么输入 8,会得到 8 = 1 + 7,然而 1 不是质数(素数)。
质数的定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
正确的写法:p = 1;
判断素数的代码
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int i, n; // i 为循环所用, n 为一个数
int flag, j; //flag 判断是否为素数 , j 为输入 n 的次数
printf("Input an integer:"); //提示输入 n
scanf("%d", &n); //输入 n
// n 要大于 1,且如果输错 3次以上,程序结束
j = 0;
while (n<2)
{
j++;
if(j>2)
{
printf("输入错误超过上限,程序结束!\n");
exit(-1);
}
printf("Input data error!\n");
printf("Input another integer:");
scanf("%d", &n);
}
//判断 n 是否为素数
flag = 1;
for (i=2; i <= sqrt(n); i++)
{
if(0 == n % i)
{
printf("This is not prime.\n");
flag = 0;
break;
}
}
if (flag == 1)
printf("This is prime.\n");
return 0;
}