我想编写一个程序来查找从b到a的所有素数,所以我编写了这段代码(有效):
public static void main(String[] args) {
int a;
int c;
boolean isPrime;
a = 2;
c = 0;
while(a <= 100000 ){
isPrime = true;
for (int b = 2;b<a; b++){
c = a%b ;
//System.out.println(c);
if ( c == 0){
// this stores every not prime number
isPrime = false;
}
}
if (isPrime){
System.out.println(a);
}
a=a+1;
}
} // main end
接下来,我尝试编写此代码的变体,但不起作用:
public static void main(String[] args) {
int q;
int w;
boolean isPrimeOne = false;
q = 2;
w = 0;
while(q <= 100){
isPrimeOne = false;
for (int d = 2; d<q; d++){
w = q%d;
if( w != 0 ){
isPrimeOne = true;
}
}
}
if(isPrimeOne){
System.out.println(w);
}
w = w+1;
}
在我看来,我的第一个和第二个代码非常相似。唯一的区别(我看到)是我在第一个中将isPrime
初始化为true
,在第二个中初始化为false
。
为什么第一个代码有效,第二个代码没有?
答案 0 :(得分:2)
2个代码示例相似,但它们在isPrime
和isPrimeOne
变量的初始化和处理方面相反。
第一个代码假设一个数字是素数(true
),直到找到一个因子。这证明了数字是复合的,所以它被设置为false
并且它一直保持这种方式直到循环结束。只需要一个因素来证明它是复合的。
但是,第二个代码假定一个数字是复合的(false
),直到找到一个不是因子的数字。但仅仅因为发现一个数字不是一个因素并不意味着它是最重要的。例如。 20
没有3
作为因素,但它仍然是复合的。您正在打印w
,其余部分,而不是q
,您正在测试的数字。您正在递增w
而不是q
,这超出了while
循环,而不是while
循环内部。
答案 1 :(得分:0)
这里有四个问题:
w
而不是q
; while
循环之外(检查你是否匹配大括号); isPrimeOne
相对于isPrime
的逻辑,但是没有检查打印数字,所以你只输出非素数的东西; w
而不是q
。我建议你尽可能地减少变量的范围,不需要在方法的开头声明所有变量。如果您在w
循环中声明isPrimeOne
和while
,则会阻止您尝试在其他位置错误地使用它们。
答案 2 :(得分:0)
“在我看来,我的第一个和第二个代码非常相似。唯一的区别(我看到)是我初始化的首先是真正的首先,并且作为假的第二个是素数。”
其实不是。这两个项目有很多不同之处。只需对每一行做一个简单的比较,你就会发现它们。
“为什么第一个代码工作而第二个代码不起作用”
因为第一个程序遵循一个有效的算法来查找素数。第二个程序不遵循任何此类算法。有关详细信息,请参阅rgettman的回答。