编写程序,验证任意一个偶数为两个素数之和,并输出这两个素数。
#include <stdio.h>
int isprime(int);
void even(int);
int main()
{
int a;
printf("Enter a even numner:");
scanf("%d",&a);
if(a % 2 == 0) even(a);
else printf("The %d isn't even number\n'",a);
}
void even(int x)
{
int i;
for(i = 2;i <= x/2;i++)
if(isprime(i))
if(isprime(x-i))
{
printf("%d = %d+%d\n",x,i,x-i);
return;
}
}
int isprime(int a)
{
int i;
for(i = 2;i <= a/2;i++)
if(a % i == 0)
return 0;
return 1;
}
以上是书上给出的代码但是我在计算和运行后发现这个代码如果输入0或者2的话会没有任何输出内容,0和2在c中不是偶数吗
0和2是偶数
但是它们没法表达成两个素数的和,因为最小的素数是2
这个猜测只对>2的偶数有效,因此代码这样改:
#include <stdio.h>
int isprime(int);
void even(int);
int main()
{
int a;
printf("Enter a even numner:");
scanf("%d",&a);
if(a == 0 || a == 2 ) printf("The %d isn't ok\n'",a);
else if(a % 2 == 0) even(a);
else printf("The %d isn't even number\n'",a);
}
void even(int x)
{
int i;
for(i = 2;i <= x/2;i++)
if(isprime(i))
if(isprime(x-i))
{
printf("%d = %d+%d\n",x,i,x-i);
return;
}
}
int isprime(int a)
{
int i;
for(i = 2;i <= a/2;i++)
if(a % i == 0)
return 0;
return 1;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:这段代码存在两个问题导致无法正确输出任意一个偶数为两个素数之和的结果:
int isprime(int a) {
if (a < 2)
return 0;
int i;
for (i = 2; i <= sqrt(a); i++) {
if (a % i == 0)
return 0;
}
return 1;
}
void even(int x) {
int i;
for (i = 2; i <= x/2; i++) {
if (isprime(i)) {
if (isprime(x-i)) {
printf("%d = %d + %d\n", x, i, x-i);
return;
}
}
}
}
修改后的代码如下:
#include <stdio.h>
#include <math.h>
int isprime(int);
void even(int);
int main() {
int a;
printf("Enter an even number:");
scanf("%d", &a);
if (a % 2 == 0)
even(a);
else
printf("The %d is not an even number\n", a);
}
void even(int x) {
int i;
for (i = 2; i <= x/2; i++) {
if (isprime(i)) {
if (isprime(x-i)) {
printf("%d = %d + %d\n", x, i, x-i);
return;
}
}
}
}
int isprime(int a) {
if (a < 2)
return 0;
int i;
for (i = 2; i <= sqrt(a); i++) {
if (a % i == 0)
return 0;
}
return 1;
}
这样修改之后,该代码能正确输出任意一个偶数为两个素数之和的结果。