小于200万的所有质数之和
Sum of all primes less than 2 million
我试图找出所有小于 2,000,000 的素数之和,但它给出了错误的答案。我如何改进我的代码?
我得到 1179908154 作为答案,但原始答案是 142913828922。
public class main {
static boolean isPrime(int n) {
if (n%2==0) return false;
for(int i=3;i*i<=n;i+=2) {
if(n%i==0)
return false;
}
return true;
}
public static void main( String[] args) {
int sum=2;
for (int j=3;j<2_000_000;j=j+2){
if(isPrime(j))
sum+=j;
}
System.out.println("SUM : "+sum);
}
}
int 最多只能达到 2^32,所以你有溢出。你必须使用长到 2^64.
此外,仅在值高达 200 万的列表上使用筛子来查找所有素数(更高效的算法)会更简单。然后通过筛子,总结所有找到的素数。您可以牺牲内存来换取更快的速度和更简单的代码。
更好的解决方案是 Sieve,它在 O(n)
时间复杂度下工作,我们得到所有小于 n
的素数,然后我们可以将它们相加。
我试图找出所有小于 2,000,000 的素数之和,但它给出了错误的答案。我如何改进我的代码? 我得到 1179908154 作为答案,但原始答案是 142913828922。
public class main {
static boolean isPrime(int n) {
if (n%2==0) return false;
for(int i=3;i*i<=n;i+=2) {
if(n%i==0)
return false;
}
return true;
}
public static void main( String[] args) {
int sum=2;
for (int j=3;j<2_000_000;j=j+2){
if(isPrime(j))
sum+=j;
}
System.out.println("SUM : "+sum);
}
}
int 最多只能达到 2^32,所以你有溢出。你必须使用长到 2^64.
此外,仅在值高达 200 万的列表上使用筛子来查找所有素数(更高效的算法)会更简单。然后通过筛子,总结所有找到的素数。您可以牺牲内存来换取更快的速度和更简单的代码。
更好的解决方案是 Sieve,它在 O(n)
时间复杂度下工作,我们得到所有小于 n
的素数,然后我们可以将它们相加。