关于C语言的素数问题!代码在下面,这样写为什么不对,求详解!

# include <stdio.h>

int main(void)
{
int i,j;

for(i=101; i<=200; ++i)
{
for(j=2; j<i; ++j)
{
if (i%j!=0)
printf("%d\n", i);
}
}

return 0;
}

第1个回答  2011-08-03
按照楼上的思路:(先给出正确代码):
# include <stdio.h>

int main(void)
{
int i,j;

for(i=101; i<=200; ++i)
{
for(j=2; j< (i / 2 + 1); ++j)
{
if (i%j==0)
break;
if (j == i / 2)
printf("%d\n", i);
}
}
return 0;
}

楼主应该注意到该程序是个两层循环结构,素数的解题思路是除1和本身没有整除的除数,而楼上给出的内层循环只是简单考虑到了取模不为零(如111:在2时符合上述算法,不能整除取模不为零,此刻按照程序流程就会输出111这个非素数(能被3整除))。。。正确做法是内层循环中,若判断为非素数,则break一下循环,在一直判断一个数最终是素数时(应该就是最后的除数啦)时才能说明该数是素数。。。。。楼主应该注意到了,我的除数循环从只到(i / 2 + 1),即只要取被除数一半就能判断结果,从而优化了代码,运行结果一样但效率更高。。。另外建议楼主回去把这个算法改得通用些(不适用1这种特殊情况呀)。。。还有代码格式也稍微注意下,看起来方便些。。。
第2个回答  2011-08-03
你想做什么呢,101-200之间的素数吗??
#include <stdio.h>

int main()
{
int i , j, k, flag;

for(i = 101;i <= 200;i ++ )
{
flag = 1;
for(j = i - 1;j > 1;j -- )
{
if(i % j == 0)//只有从二到i都没有余数才是素数,出现余数为0,就不是素数了
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
}追问

我只是想搞明白我错在哪,怎么改?要答案网上多了去了。

第3个回答  2011-08-03
第二层循环,只要有数不能被整除,就输出。
经过优化,目前效率个人认为最好的,如有更好方法,望指教。
大一的孩,鼓励下。
#include <stdio.h>
#include <math.h>
void main(void)
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<=200;m+=2)
{
k=(int)sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
{
leap=0;
break;
}
if(leap)
{
printf("%-4d",m);h++;
if(h%10==0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d",h);
}追问

我只是想搞明白我错在哪,怎么改?要答案网上多了去了。

追答

这话我喜欢,那两代码对比下,看的那个字母不一样总会吧。
这个代码,我从大一接触到现在改过三回。
网上代码多了去了,问题是自己得分析啊,不一样的也多了去了。
建议去CSDN多逛逛。看在你是大一的份上,给你对比下字母。
#include
#include
void main(void)
{
int m,i,k,h=0,leap=1;
printf("\n");
for(m=101;m<=200;m+=2)//偶数肯定不是素数,可以直接排出
{
k=(int)sqrt(m);//合数a=b×c,b、c肯定满总一个大于a的开方,一个小于
for(i=2;i<=k;i++)
if(m%i==0)
{
leap=0;//标志标量,用来确定是否为素数
break;
}
if(leap)
{
printf("%-4d",m);h++;
if(h%10==0)
printf("\n");
}
leap=1;
}
printf("\nThe total is %d",h);
}

追问

呵呵 这个程序我也看过 也看懂了 只是不明白为什么一定要一个leap 可以不用么?
我知道我上面的只要一个不等于0就会输出,而且会重复多次。

追答

leap属于标志,用来确定是否能被整出,能被整出的leap=0,不输出。目前不能省。

本回答被提问者采纳
第4个回答  2011-08-03
应该是对的啊 你这个程序算出来的答案是啥?追问

++i 和i++ 本质上是有那么一点区别,但是在这个程序里是体现不出来的。

第5个回答  2011-08-03
额。。。你大一的吧?追问

初学C语言

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网