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;
}
控制台没有给我任何答案。你能帮忙吗?
答案 0 :(得分:2)
您的代码似乎运行缓慢。您可以通过以下几种方式改善其性能:
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
&lt; = y
我们知道x
&lt; = sqrt(number)
&lt; = 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