我正在执行代码以显示从1到100的素数。当我执行以下代码时,它不会显示所有数字。这是代码
public class PrimeNumberSeries {
public static void main(String[] args) {
boolean flag = true;
for(int i=1; i <= 100; i++){
for(int j=2; j<= i-1; j++){
if(i%j==0){
flag = false;
break;
}
}
if(flag == true){
System.out.println("The number is prime number. Value = "+ i);
}
}
}
}
我对flag变量的声明感到困惑。如果我在第一个for循环中声明变量,那么程序会向我显示正确的输出,即
for(int i=1; i <= 100; i++){
boolean flag = true;
for(int j=2; j<= i-1; j++){
背后的原因是什么?
如果变量在main方法上方声明为Class变量(static boolean flag
),那么它也会显示相同的输出。
答案 0 :(得分:2)
在boolean flag = true;
的forLoop内初始化i
,确保j
的每个增量再次为flag
分配值true
。这就是正确的实现,因为您假设最初的数字为:i
是primeNumber,当您找到它的任何除数时,您可以flag=false
答案 1 :(得分:1)
如果在您的循环外宣布boolean flag
,则每个true
的{{1}}都不会重置为Integer i
。因此,boolean flag
更改为false
后,对于每个false
,它将保持Integer i
。在循环内部声明它确保每次都重置为true
。
答案 2 :(得分:0)
第二个是正确的。
第一个版本中的问题是因为有时flag
未在循环中更改,因此使用初始化值。
以不同的方式说:具有之前(或之前的一些)检查的价值。
或者在伪代码中正确的算法是:
for every number from 1 to 100
assume is prime
check, maybe have dividor -> not prime
print
答案 3 :(得分:0)
您不需要检查j值直到j <= i-1
for(int j=2; j<= i-1; j++)
你需要直到 j&lt; = Math.sqrt(i)
以下是针对您的用例的小优化解决方案。
int n=100;
System.out.println("All Prime Numbers Between 1 to "+n);
boolean isPrime;
for (int i = 2; i <= n; i++) {
isPrime = true;
for (int j = 2; j <=Math.sqrt(i); j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime)
System.out.print(i + " ");
}