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\t",m);
        if(++n%9==0)
            printf("\n");
    }
}

}

为什么一定要在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\t",m);
        if(++n%9==0)
            printf("\n");
    }
}

,因为要输出的是素数,素数的定义就是除啦1和它本身外不能被任何数整除。而这里的k>=m表示m未被整除,在上面已经有k++来增加k的值,所以才如此判断

你求的是素数,素数的定义就是只能被1和它本身整除,所以肯定要(k>=m),第二种算法主要是用根号,如果在根号i都只有1能整除,之后的都可以不要判断啦,相对而言,第二种方法运行速度比第一种快,工作量小。

被除数是m ,除数是k ,当除数大于被除数了,再运算也就没有意义了,所以程序在对看进行判断到等于m时就是一个分界线了,所以选择在除数大于等于被除数时,来结束判断,从而输出最终的结果。。。