我想编写一个程序来查找从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
。为什么第一个代码有效而第二个代码无效?
最佳答案
这两个代码示例相似,但是在isPrime
和isPrimeOne
变量的初始化和处理方面相反。
第一个代码假定在找到一个因子之前,数字是质数(true
)。这证明了数字是复合数字,因此将其设置为false
并一直保持这种状态,直到循环结束为止。仅需一个因素即可证明它是复合的。
但是,第二个代码假定一个数字是复合(false
),直到找到一个不是因数的数字为止。但是,仅仅因为发现数字不是影响因素,并不意味着它是质数。例如。 20
没有3
作为因素,但是它仍然是复合的。您正在打印w
其余的数字,而不是q
您正在测试的数字。您正在递增w
而不是q
,那是在while
循环之外而不是在while
循环内。