问题描述
- C语言程序求帮忙解惑,谢谢了
-
求1000以内的素数
#include
void main()
{int m,k,n=0; for(m=2;m<1000;m++) { for(k=2;k<m;k++) { if(m%k==0) { break; } } if(k>=m) { printf("%d ",m); if(++n%9==0) printf(" "); } }
}
为什么一定要在k>=m是才输出呢
解决方案
解决方案二:
#include
int main()
{
int i,j;
for(i=2;i
{
for(j=2;j*j
if(i%j==0)
break;
if(j*j>i){
printf("%d ",i);
}
}
}
这个也是那个问题,可是第二层循环是为什么要用j*j和i比较呢
解决方案三:
第一个问题:不判断k>=m就退出怎么保证k就不能整除m...= =
第二个问题:简单的数学知识,一个整数m如果在2到[aqrt(m)]区间内没有整数可以整除它,那么在[aqrt(m)]到m区间内也不会有整数可以整除,
因为整除关系是一一对应的
解决方案四:
for(k=2;k
{
if(m%k==0)
{
break;
}
}
if(k>=m)
这里用 k>=m 说明上面的循环没有break,如果break的话,说明m就不是素数了
解决方案五:
k >= m最主要的是判断k == m,for(k=2;k<m;k++) 这个循环结束后,如果是素数,那么k应该是等于m的。
解决方案六:
k>=m说明当前数m对于2~m-1都不可被整除,是素数
解决方案七:
for(m=2;m<1000;m++)
{
//判断2~m-1之间是否存在m的因子,有的话就break
for(k=2;k<m;k++)
{
if(m%k==0)
{
break;
}
}
//如果在上一个for循环中,是break出来的,则k一定小于m;如果正常循环结束,则一定有k>=m,也就是说在2~m-1之间不存在m的因子(否则的就会break出来,使得k<m)
if(k>=m)
{
printf("%d ",m);
if(++n%9==0)
printf("
");
}
}
解决方案八:
,因为要输出的是素数,素数的定义就是除啦1和它本身外不能被任何数整除。而这里的k>=m表示m未被整除,在上面已经有k++来增加k的值,所以才如此判断
解决方案九:
你求的是素数,素数的定义就是只能被1和它本身整除,所以肯定要(k>=m),第二种算法主要是用根号,如果在根号i都只有1能整除,之后的都可以不要判断啦,相对而言,第二种方法运行速度比第一种快,工作量小。
解决方案十:
被除数是m ,除数是k ,当除数大于被除数了,再运算也就没有意义了,所以程序在对看进行判断到等于m时就是一个分界线了,所以选择在除数大于等于被除数时,来结束判断,从而输出最终的结果。。。