任务是实现一个程序,该程序计算给定数字sumtoBreak中有多少个不同的素数和。

方法primeSum应从数字currprime中减去所有可能的质数sumtoBreak,直到sumtoBreak变为零,然后对每种可能性返回(总和)一个。考虑到所有可能性,在每个衰退步骤中,它都会自我称呼


sumtoBreak - currprime
nextPrime自称。


我的问题是,除非开始时sumtoBreak为零,否则Java不会返回任何内容。
希望得到任何建议!

这是代码(我知道带有嵌套if语句的代码中的括号是多余的,但我只是想确保这不是问题):

这是固定代码:

public class PrimeSum {
    public static boolean isPrime(int primecandidate) {
        int count = 0;
        for (int i = 2; i <= primecandidate / 2; i++) {
            if (primecandidate % i == 0)
                count++;
        }
        if (count == 0)
            return true;
        else
            return false;
    }

    public static int nextPrime(int currprime) {
        int j = currprime + 1;
        while (!isPrime(j))
            j++;
        return j;
    }

    public static int primeSum(int sumtoBreak, int currprime) {
        if (sumtoBreak == 0) {
            return 1;
        } else {
            if (sumtoBreak < 0 || currprime > sumtoBreak) {
                return 0;
            } else {
                return primeSum(sumtoBreak, nextPrime(currprime)) + primeSum(sumtoBreak - currprime, currprime);
            }
        }

    }

    public static void main(String[] args) {
        System.out.println(primeSum(Integer.parseInt(args[0]), 2));
    }
}

最佳答案

这不会回答您的问题,但是可以纠正isPrime方法中的错误并更快地计算结果:

private static boolean isPrime(final int primecandidate) {

    if ( primecandidate <  2) {        // 0 & 1 are NOT Prime
        return false;
    }
    if ((primecandidate & 0x1) == 0) { // Even is NOT Prime...
        return primecandidate  == 2;   // ...except for 2 (and 0).
    }
    for (int i = 2, iMax = (int) Math.sqrt(primecandidate); i <= iMax; i++) {
        if (primecandidate % i == 0) {
            return false;
        }
    }
    return true;
}


请注意以下几点:


最后一个参数primecandidate标记为final
它将0和1的结果更正为false
该方法被标记为私有
iMax是Sqrt(primecandidate)而不是primecandidate / 2
iMax计算一次,而不是每次迭代
我使用一种称为“完成后就可以完成”的策略。
含义:不要设置标志(以您的情况为准),请出去!


另请注意,有一个Apache Commons Math3函数...


  org.apache.commons.math3.primes.Primes.isPrime(j)


较小的值(对于较大的值(例如Integer.MAX_VALUE),它的速度要快一些

还有一个BigInteger.isProbablePrime(...)函数,但根据我的基准测试,它的运行速度很慢。

希望这会有帮助?

07-24 21:07