任务是实现一个程序,该程序计算给定数字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(...)函数,但根据我的基准测试,它的运行速度很慢。
希望这会有帮助?