我正在尝试打印2到100之间的所有素数,但我只得到2到3。
我已经尝试了所有可能的替代方法,但是它都带有不同的错误或不同的输出。
public static void main(String[] args) {
boolean flag = true;
for (int i = 2; i <= 100; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println(i);
}
}
}
我不需要任何替代方法,我只想知道代码中发生了什么,为什么它只给出2和3?
答案 0 :(得分:1)
一旦您遇到第一个非质数,就将标志设置为false
,但您却忘记了重置以进行下一次运行。
因此,在点击 4 (不是质数)后,它是false
,并且保持为假。
您可以通过在外部循环的开头添加flag = true;
来解决此问题。由于仅在循环内部需要该标志,因此您也可以直接在其中定义它:
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
boolean flag = true; // "Resetting" the flag here
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println(i);
}
}
}
变量名flag
是一个很糟糕的名字,isPrime
呢。那会很习惯。
如果将支票移至专用方法,也可能会提高可读性:
public static boolean isPrime(int number) {
for (int j = 2; j < number; j++) {
if (number % j == 0) {
return false;
}
}
return true;
}
然后像这样使用它:
for (int i = 2; i <= 100; i++) {
if (isPrime(i)) {
System.out.println(i);
}
}
答案 1 :(得分:0)
您需要将flag
重设为true
。
试试这个:
if (i % j == 0) {
flag = false;
break;
} else {
flag = true;
}
这使我的输出达到近100。
答案 2 :(得分:-1)
您只需要在内部循环之后将标志设置为true。否则,if(flag)的条件将在该标志首次设置为false时不通过。如果该标志设置为false,则它将退出循环,否则将被设置为true。
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
boolean flag=true; // <---- Here
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println(i);
}
}
}