#include<math.h>
int main()
{
int m, k, i, n=0;
for(m=101; m<=200;m=m+2)
{
k=sqrt(m);
for(i=2;i<=k; i++)
if(m%i= =0)break;
if(i>=k+1){printf("%d", m);n=n+1;}
if(n%10= =0)printf("\n");
}
printf("\n");
getch();
}
----------------解决方案--------------------------------------------------------
刚学C语言,刚刚接触win-tc软件,用这个程序试验一下这个软件,结果系统总是提示有错误,请大家看看错在哪里。
#include<math.h>
int main()
{
int m, k, i, n=0;
for(m=101; m<=200;m=m+2)
{
k=sqrt(m);
for(i=2;i<=k; i++)
if(m%i= =0)break; 等号之间不能有空格
if(i>=k+1){printf("%d", m);n=n+1;}
if(n%10= =0)printf("\n");
}
printf("\n");
getch();
}
----------------解决方案--------------------------------------------------------
顺便说一下,一直以来,论坛上有很多类似求质数的帖子,一直都是用sqrt(num)来控制循环的次数,从纯数学的角度来讲,这是没问题的,
但在c中却有一定的风险,实际上,大家都知道,sqrt()的开方运算在计算机并不是精确的,举个例子,如果num=169,在数学上,理所当然,开方后就是13,然而计算机的开方运算却不是按人的思维来的,它算出来的结果很可能是12.9999999,于是,去除num的数就是2,3,5,7,11而不含13,因此按照楼上的程序就变成169是质数了.
解决的办法很简单,不用开方,用平方即可,用a*b<num来控制循环,程序执行的正确率不仅可以提高,还可以省去开方这种复杂的运算,从而提高程序的运行速率。
----------------解决方案--------------------------------------------------------
谢谢大家的指点,我知道错在哪里了。本来自学C觉得很无助,有你们的帮助,感觉有信心多了。
按二楼朋友的指点,我运行了一遍,编译成功。
三搂版主的建议让我大开眼界,我看课本上总是用开方,以为只有这一种方法呢。现在知道C还是很灵活的。不过,我还是刚刚看到循环这一章,对于版主的方法并不知道如何操作,还是谢谢你的指点。
----------------解决方案--------------------------------------------------------
for(i=2;i*i<=m; i++)
这样,斑竹对吧.
----------------解决方案--------------------------------------------------------
呵呵,正是,楼上是聪明的人,楼主不妨再仿写个程序练练。
----------------解决方案--------------------------------------------------------
谢谢指教!
----------------解决方案--------------------------------------------------------
但在c中却有一定的风险,实际上,大家都知道,sqrt()的开方运算在计算机并不是精确的,举个例子,如果num=169,在数学上,理所当然,开方后就是13,然而计算机的开方运算却不是按人的思维来的,它算出来的结果很可能是12.9999999,
以前为了这个问题..feng和牧羊吵过一次
虽然我不知道sqrt的具体算法
可是..sqrt(169) 你能举例给出他不等于13的时候吗?
用你的机器截图也可!
----------------解决方案--------------------------------------------------------
我记得计算机里面好象是按二分法算的,用泰勒公式算的,不断精确,直到达到某一精度,计算机就停止计算了,
至于举例,我无能为力,169既然计算机算出的结果是13.00000000,那任由再算N次,也还是13的,
不过,当数大的时候,存在这种可能,而丢掉小数部分。
----------------解决方案--------------------------------------------------------