有几种选择。既然你知道这个数字在0-100之间,显而易见的方法是:作弊,简单地创建一个数组并填入数字。
另一种方法是使用循环。你需要找出100以下的所有质数,因为小于100的数字不能用大于100的质数之和表示。例如,99不能表示为2和任何大于100的质数之和。
你还需要知道的是:偶数的和的最大长度是该数字除以2。因为2是最小的质数。对于奇数,最大长度是(数字-1)/2。
例如:
8 = 2 + 2 + 2 + 2,因此和的长度为4
9 = 2 + 2 + 2 + 3,因此和的长度为4
如果你想要更好的性能,你可以通过使用GPGPU来作弊,这将显著提高性能。
然后是洗牌方法。如果你知道7 = 2 + 2 + 3,那么你也知道7 = 2 + 3 + 2。要做到这一点,你需要一种计算不同洗牌可能性的方法。你可以存储可能性的组合或在编写循环时记住它们。
这里是一个相对蛮力的方法(使用Java):
int[] primes = new int[]{};
int number = 7;
int maxLength = (number % 2 == 0) ? number / 2 : (number - 1) / 2;
int possibilities = 0;
for (int i = 1; i <= maxLength; i++){
int[][] numbers = new int[i][Math.pow(primes.length, i)];
for (int j = 0; j < Math.pow(primes.length, i); j++){
int value = 0;
for (int k = 0; k < i; k++){
numbers[k][j] = primes[(j - value) % (Math.pow(primes.length, k))];
value += numbers[k][j];
}
}
for (int x = 0; x < primes.length; x++){
int sum = 0;
for (int y = 0; y < i; y++){
sum += numbers[y];
if (sum > number) break;
}
if (sum == number) possibilities++;
}
}
我知道这很复杂。我会尝试用类比来解释。把它想象成一个组合锁。你知道最大的轮数,因此需要尝试,这就是“i”循环。接下来,你通过每个可能性(“j”循环)然后设置单个数字(“k”循环)。在“k”循环中的代码用于从当前可能性(j的值)到实际数字的转换。在输入了该数量的所有组合之后,计算是否有任何正确的组合,如果有,则增加可能性的数量。
如果我的代码有任何错误,我提前向您道歉。