内循环for(i=2;i<=n-1;i=i+1)如果是因为break跳出的,那么跳出时的i的值是n的约数,即满足(n%i==0)==true。那么这个时候,if(i>=n) 的判定条件就是false了(因为n>=3,约数不会比它自己还大或等于,这样的素数只有一个,即2)。
从另一方面讲,如果内循环不是因为break跳出的,就表示在在区间2<=i<=n-1内,没有哪个i是n的约数,即break的条件不满足。那么跳出内循环的时候,i的值是和n一样大的,即(i==n)==true。这个时候,if(i>=n) 的判定条件就满足了。细想一下,此时的n是不是素数呢?
第二个for语句只执行到break,如果不是素数就提前调出循环;
第二个if语句是在第二个for语句之外的,执行完全部循环才会执行它,如果是素数就会输出;
原理很简单,就是依次取3到100赋给n,用n去除2到n-1这些数,如果有除的净的就会提前跳出第二个循环,这时的i肯定小于n,如果都除不净,则跳出循环后i肯定等于n。
所以 if(i==n) printf("%d\t",n);也可以达到同样的效果
i是循环控制的次数,如果i>=n说明从2到n-1都没有一个数能被n整除,那依据定义当然可以断定n是一个素数,否则n就不是一个宿舍。
其次如你所说n=3的时候,i=2 的时候i>=n不成立所以不会执行printf("%d\t",n)。
问题解决!
求素数的某种算法。