public static void main(String[] args) {
long sum=0;
problemTen a= new problemTen();
for (int i=2; i<2000000 ; i++){
if(a.isPrime(i))
sum += i;
}
System.out.println(sum);
}
public boolean isPrime(long num){
if(num==1) return false;
if(num==2) return true;
for (int k=2; k<num; k++){
if(num%k ==0) return false;
}
return true;
}
控制台没有给我任何答案。你能帮忙吗?
最佳答案
您的代码似乎运行缓慢。您可以通过几种方式提高其性能:
您无需在1
方法中测试2
或isPrime(long num)
,因为您已经开始从2
循环,并且已经在使用for (int k=2; k<num; k++){
测试该值
不要测试所有数字,而只能测试奇数(您已经知道4
,6
,...不是质数),所以不要
for (int i=2; i<2000000 ; i++)
您可以使用
for (int i=3; i<2000000 ; i+=2)
// ^ ^^^^ - changes
但不要忘记使用
sum
而不是2
初始化0
。但是对性能的最大影响是避免测试
sqrt(num)
中的isPrime
值以上的值。想想看,如果某个数字不是素数,则意味着它可以写为number = x * y
。假设x
y,我们知道x
sqrt(number) y,因此,如果我们警告找不到x
,则搜索y
没有意义。所以在isPrime
而不是for (int k=2; k<num; k++)
采用
int sqrt = (int) Math.sqrt(num);
for (int k = 2; k <= sqrt; k++)
// ^^^^^^^^^^
因此,对于
num
这样的123454321
,最大迭代次数不是~123454321
,而是sqrt(123454321) = 11111
关于java - 欧拉项目#10无法在Java上得到答案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28615059/