请高手们帮我解决这道题目,小弟太笨了,总有一步不懂

来源:百度知道 编辑:UC知道 时间:2024/06/20 08:57:59
int isprime(int m)
{int g;
for(g=2;g<m;g++)
if(m%g==0) return 0;
return 1;
}
void even(int k)
{int i;
for(i=2;i<k;i++)
if(isprime(i))
if(isprime(k-i))
printf("%d=%d+%d",k,i,k-i);
}
main()
{int x;
scanf("%d",&x);
if(x%2==0) even(x);
else printf("NO");
}

当输入x=12时,输出的结果是 12=5+7 12=7+5 12=11+1
整道题目是验证任意偶数为两个素数之和的,其中,前两个12=5+7 12=7+5 我都明白,但后面一个 12=11+1 我就不明白了,以为我定义了g是等于2的,应该不肯定出现12=11+1这条式子的,而且我想要的答案是前面两个,为什么会出现后面那一个,望各位高手帮帮我!!~谢谢!!

把你的程序变成如下可得到理想结果
int isprime(int m)
{int g;
for(g=2;g<m;g++)
if(m%g==0) return 0;
return 1;
}
void even(int k)
{int i;
for(i=2;i<k,k-i>2;i++)
if(isprime(i) && isprime(k-i))
printf("%d=%d+%d\n",k,i,k-i);
}
main()
{int x;
scanf("%d",&x);
if(x%2==0) even(x);
else printf("NO");
}
解析:当i=11时,k-i=1.把1传给isprime(int m)后,for 循环的判断条件g<m 不成立,退出for循环。跟本不判断if 语句。执行return1. 所以会输出12=11+1
建议:if(isprime(i)
if(isprime(k-i)
这种书写不规范应改成if((isprime(i) &&isprime(k-i))

你的这个函数
int isprime(int m)
{int g;
for(g=2;g<m;g++)
if(m%g==0) return 0;
return 1;
}
输入为1时,for循环不执行直接就返回1了。你添加一个对是否为1的判断就可以了

isprime函数里
如果输入为1 if语句不成立 返回值就是1了
1除以任何数的余数都是1吧~

for(g=2;g<m;g++)
if(m%g==0) return 0;
return 1;

for循环中当m为1时 不循环 直接return 1
相当于是把m=1也当做了素数