我写了一个代码,它返回值低于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/

10-16 20:45