问题出在for (n = 2; n <= 200; n++) 这里 初始化的位置不对。 因为你的双层for循环 中 内层循环达到的目标是将你从2遍历到m 你的第二种写法: int m = 2; int n = 2; 对m没啥影响,但是n就不一样了,变成了局部变量,每次从外层循环进入内层循环时,n就不再是从2开始到m了,m%n就没意义了,所以出来的结果也不准I
其实两种写法最本质的区别就是n的赋值 第一种:int n; for (n = 2; n <= 200; n++) {} 每一次进for循环时,不管n以前有没有值,值是多少,n都会被重新赋值为2(n=2),然后进入循环,值随着里面的条件而改变。 接着下一次for循环…… 第二种:int n = 2; for (; n <= 200; n++) {} 你在外面给n赋初值为2,当每次进入for循环时,n的值就会随着里面的条件而改变。但是;前是空的,这种写法每次进入for循环没有对n进行初始化为2的操作,所以n的值就是上次for循环结束时的值了。 等你学了局部变量就懂了,{}内定义的变量跟{}外定义的变量作用范围不一样。初学者都不容易,当初学for循环不知道写了多少个死循环…… 第一种写法稍微改改也是可行的: int c = 0; int m = 2; int n = 2; // int n, m; for (m = 2; m <= 200; m++) { for (; n <= 200; n++) { if (m % n == 0) {break;} }if (n >= m) {System.out.print(m + "\t"); c++; if (c % 10 == 0) { System.out.println(); } } n = 2; } }I