所以,我正在开始学习编程并尝试用java编写项目euler。问题10看起来非常简单,我认为我可以使用一种方法,以前在另一个问题中获得质数。问题是,该方法有效,除非我把它放在for循环中,我无法看到它与另一个之间的差异。
所以这是我的代码
package euler10;
public class Primesum {
public static void main(String[] args) {
int suma=0;
for (int i=0; i<2000000; i=i+2){
if (isPrime(i) == true){
System.out.println(i);
suma=suma+i;
}
}
System.out.println(suma);
}
public static boolean isPrime(int num) {
boolean prime = false;
long i;
for (i=2; i < Math.sqrt(num) ; i++){
long n = num%i;
if (n == 0){
prime = false;
} else {
prime = true;
}
}
return prime;
}
}
isPrime方法在循环中运行良好,但在其中它总是正确的。即使是偶数,它也会返回真实,我认为那些不是很优质:)
答案 0 :(得分:2)
我真的不认为循环有任何关系......
然而,代码中存在逻辑缺陷......
public static boolean isPrime(int num) {
long i;
for (i=2; i <= Math.sqrt(num) ; i++){
long n = num%i;
if (n == 0){
return false;//found a divisor : not prime
}
}
//went through all the way to sqrt(num), and found no divisor: prime!
return true;
}
我们可以在找到第一个除数时停止,没有必要找到所有这些 - 这是另一个练习......
另外,从逻辑上讲,如果想要以这种方式使用布尔变量,那么它将使用true
进行初始化,然后放入false
,并在找到除数时保持该值。 ..
答案 1 :(得分:0)
您的isPrime功能不正确;你应该将return true
语句延迟到循环结束之后,当你知道 i 的所有值都没有除以 num 时。
此外,试验分割对于这个问题不是一个好的算法;使用筛子会快得多。这是一个使用Eratosthenes筛子对小于 n 的素数求和的算法:
function sumPrimes(n)
sum := 0
sieve := makeArray(2..n, True)
for p from 2 to n
if sieve[p]
sum := sum + p
for i from p*p to n step p
sieve[i] := False
return sum
这应该在不到一秒的时间内计算少于200万的素数之和,这比你的程序要快得多。如果您对使用素数进行编程感兴趣,或者如果您打算解决一些更高级的Project Euler问题并且需要一些更快的算法,我在我的博客上谦虚地推荐这个essay。