回复 楼主 温酒斩化腾
题主是个新手吧,我没有像楼上两位把你的代码思路直接全改了,因为毕竟我也是从新手过来的,知道那样解决不了问题
但我不得不批评下,改你这程序实在害人,一开始以为可能只是一处两处的逻辑错误,后来才发现这逻辑错误真是不止一点啊。。。
你调试的出来才见鬼,,
三点建议:1,新手做题请务必打草稿,把思路弄清
2,尽快学会一些简单的调试方法,你这个程序我一
添加查看l的值就发现了问题
3,用flag不如用break或continue,逻辑不容易混乱
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,l,flag=1,k;
for(i=150;i<=200;i+=2,flag=1) //将flag复归原值是个很重要也需要注意的问题,初学者经常犯错
for(j=2;j<=i/2;j++,flag=1)//判断条件这里可以修改为i/2,因为大于i/2和小于i/2等价 ,但199,绝对不可以,因为都这样i-j可能为负
{
for(l=2;l<=(int)sqrt(i-j)&&flag;l++)
for(k=2;(k<=(int)sqrt(j))&&flag;k++)
{
if((i-j)%l==0||j%k==0)//你这里严重逻辑错误,按你的每次循环一开始就j=2,k=2,所以你的程序一运行,flag就等于零,循环终止 ,所以我在j循环里加了flag=1
{
flag=0;
}
if(l==(int)sqrt(i-j)&&k==(int)sqrt(j))//你这里逻辑也错误啊,并不是 不满足(i-j)%l==0||j%k==0, 就可以证明两个数是素数,而是要把所有的l,k尝试完才行
{
printf("%d=%d+%d\n",i,i-j,j);
flag=0;
}
}
}
return 0;//还有这里加上return 0是个基本常识,因为可以根据返回值判断程序是否运行正确
}