我的问题与以下代码有关:
public static void main(String[] args) {
// Find Prime Numbers from 0 to 100
int i;
for (i=2; i <= 100; i++) {
int j = 2;
boolean iPrime = true;
//The following line gives incorrect results, but should execute faster
// while ((iPrime = true) && (j < (i / 2 + 1))) {
//The following line gives correct results but performs un-necessary operations
//by continuing to calculate after the number is found to be "not prime"
while (j < (i / 2 + 1)) {
j++;
if ((i % j) == 0) {
iPrime = false;
//System.out.println(j + " is a factor of " + i);
}
}
if (iPrime) {
System.out.println(i + " is a prime number!");
}
}
}
现在,正如我在代码中所评论的那样,我想要实现的是通过仅在iPrime = true时执行'while'循环来更快地执行我的程序。 50%的数字可以被2整除,所以一旦确定,计算就可以停止了。
我正在从一本书中作为初学者'例子'的一部分来做这个项目,我实际上是想尽快为自己的“额外信用”计算高达1000000 ......
我读到了“短路”和“操作员”&amp;&amp;如果前半部分为真,则仅评估语句的后半部分,如果为假,则两者不相互评估(节省CPU)
它也将退出循环,这将节省更多的CPU ......
但由于某种原因,它无法正常工作!我在整个过程中添加了更多的System.out.println()语句,列出了'iPrime'是什么 - 输出是奇怪的......它打开和关闭iPrime并评估每个数字,这是我无法理解的。
答案 0 :(得分:7)
if((iPrime = true) && ...)
应为if((iPrime) && ...)
。
通过执行isPrime = true
,您将真实分配给isPrime
而不是将其值'与true
进行比较。
您可能还希望看到this以更好地了解代码中发生的情况:
在运行时,赋值表达式的结果是值 分配发生后的变量。一个结果 赋值表达式本身不是变量。
因此,当您使用=
运算符而不是==
时(在将某些内容与true
进行比较时将其删除 - 而不是编写if(someBoolean == true)
,您只需编写if(someBoolean)
1}}),你实际上是在满足条件,总是!
答案 1 :(得分:4)
只需将=
更改为==
,即更改
while ((iPrime = true) && (j < (i / 2 + 1)))
到
while ((iPrime == true) && (j < (i / 2 + 1)))
性能更佳的完整代码
public static void main(String[] args) {
// Find Prime Numbers from 0 to 100
System.out.println(2 + " is a prime number!");
for (int i = 3; i <= 100; i += 2) {
boolean isPrime = true;
for (int j = 3; j * j <= i; j += 2) {
if ((i % j) == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.println(i + " is a prime number!");
}
}
}
我能想到的最快的方法是Sieve of Eratosthenes。
答案 2 :(得分:1)
johnchen902 / Maroun Maroun有你的错误修复;此外,您可以执行的优化是
System.out.println("2 is a prime number!"); // the for loop won't detect 2 anymore
for (i=3; i <= 100; i+=2) {
此外,不是对具有所有前面奇数的数字执行模运算符以查看它是否为素数,而是可以对具有所有前面素数的数字执行模运算符,以查看它是否为素数 - 例如,存储您在ArrayList中找到的素数,并在主要测试中遍历列表。
对于非常节省CPU(但空间效率较低)的算法,请使用Sieve of Eratosthenes
答案 3 :(得分:1)
首先,在运行代码时,我发现它显示4为素数,这是不正确的。原因是你的j ++线的位置。您应该将while循环更改为:
while (j < (i / 2 + 1)) {
if ((i % j) == 0) {
iPrime = false;
//System.out.println(j + " is a factor of " + i);
break;
}
j++;
}
转到第二部分,当您确定数字不是素数时,您希望避免额外的计算。您可以在上面的代码中使用break语句。
注释部分不起作用,因为您有一个赋值而不是相等比较。