我写了一个代码,它返回值低于200万的所有素数的和但要想得到结果需要很长的时间(等待30分钟才能得到答案)。
有人能建议如何使算法更有效吗?
public static void main(String[] args){
int i,primeNum=1,sumPrime=0,c=0;
while (primeNum<2000000){
int factors=0;
for(i=1;i<=primeNum;i++){
if((primeNum%i)==0) {
factors++; // total number of factors
}
}
if(factors==2){
if(primeNum<2000000){
sumPrime=primeNum+c;
c=sumPrime;
}
System.out.println(primeNum);
}
primeNum++;
}
System.out.println(sumPrime);
}
最佳答案
实际上,代码没有得到足够的优化,因为在最坏的情况下,执行循环所需的时间会更多。你甚至可以优化代码来寻找素数。
public static void main(String[] args) {
//you know 2 is the only even prime.
int sum = 2;
for (int i = 3; i <= 2000000; i++) {
boolean prime = isPrime(i);
if(prime){
sum+=i;
}
}
System.out.println("Sum = " + sum);
}
/*
* we know 2 is the “oddest” prime – it happens to be the only even prime
* number. Because of this, we need only check 2 separately, then traverse
* odd numbers up to the square root of n
*/
public static boolean isPrime(int n) {
// check if n is a multiple of 2
if (n % 2 == 0)
return false;
// if not, then just check the odds
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0)
return false;
}
return true;
}
关于java - 如何改善我的素数和算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16606004/