n<m的话你就取不到m,n就不会等于m,如果这个数是素数,应该会return 0吧 但是程序能跑出素数,求解
不会取不到m的,我们可以一步步来看。
1 在第一个for语句的第一个表达式中,便将2赋予了m;
2 然后判断第二个表达式m<=50(此时m=2),值为1(即 结果为真);
3 然后执行第一个for语句的循环体语句中的第一个语句:第二个for语句;
4 在第二个for语句的第一个表达式中,将2赋予了n(此时m=2);
5 然后判断第二个for语句的第二个表达式n<m(此时n=2,m=2),值为0(即 结果为假),不执行第二个for语句的循环体语句(即 第一个if语句),因此也不执行第二个for语句的第三个表达式(因为for语句的第三个表达式要在执行完循环体语句后才执行),此时m,n仍为2;
6 然后执行第一个for语句的循环体语句中的第二个语句(即 第二个if语句);
7 判断第二个if语句的表达式m==n(此时m,n均为2),值为1(即 结果为真),所以执行第二个if语句的语句(即 显示“2 ”);
8 此时第一个for语句的循环体语句已经执行完第一次,开始执行第三个表达式m++,使m=3,接着又回到第二个表达式m<=50,值为1,又开始第二次循环.......
其实n<=m其中的"="相当于画蛇添足,如果是一个素数的话在n<m的时候,由于n++使得n=m直接不满足内循环中的n<m了,而没使用break;
直接跳到到for(m==n)从而输出素数。如果n<=m相当于在前面的基础上多运算了一步然后break;到for(m==n),发现由于n++,n是大于m的还是没输出来。所以对于输出的素数来说n<=m,n<m都没关系
m为什么等不到4呢
因为N++,所以在跳出循环后n可能会等于m。
#include <stdio.h> #include <math.h> int main(){ int m, n,flag; for(m=2; m<=50;m++) { for(n=2; n<=sqrt(m); n++) { if(flag=(m%n==0)) break; } if(flag) continue; printf("%d ", m); } return 0; }
何止不用取到m,取到m的平方根就够了,不过取到平方根代码要改