我们有3个正整数a,b和c,其中a + b + c = k,其中k是任意正整数。
是否有最佳方法来迭代这三个整数的可能配置?
非常感谢任何伪代码或Java代码。
答案 0 :(得分:2)
您可以为a
和b
使用两个循环,但是您无需迭代c
,因为它可以计算。此外,如果顺序无关紧要,您可以假设a >= b >= c
将进一步减少您需要探索的组合。
注意:大多数这类问题都是数学问题,而不是编程挑战。在编码之前,您需要考虑优雅的数学解决方案。
答案 1 :(得分:1)
别无选择,你必须经历两个嵌套循环:
假设0<=a,b,c
和那个(2,1,1)是(1,1,2)相同的三元组(有排列等价的),你可以添加约束a<=b<=c
for(int a=0; a<=k/3; a++) { // a <= b <= c -> 3a <= k
for(int b=a; b<=(k-a)/2; b++) { // b <= c -> 2b <= k-a
c = k-a-b;
//Do your thing
}
}
答案 2 :(得分:1)
三元组(a,b,c)
使a+b+c=k
定义3D空间中的平面,即2D实体。对于给定的k
,正整数中存在(k+1)(k+2)/2
个解。这个表达式是O(k^2)
,表明双循环可以。
for a= 0 to k
for b= 0 to k-a
c= k-a-b
...
此解决方案假设
答案 3 :(得分:0)
这是我出于好奇而得到的解决方案。为您发布的问题获得此解决方案很有趣。你错过了重要的标准,三个数字必须是不同的,并且三个整数中没有一对具有大于1的公因子。
public static int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
public static int pairwisePrimes(int k) {
int numWays = 0;
for (int a = 1; a < k; a++) {
for (int b = a + 1; b < k; b++) {
for (int c = b + 1; c < k; c++) {
if ((a + b + c == k) && gcd(a, b) == 1 && gcd(a, c) == 1 && gcd(b, c) == 1) {
System.out.println("" + a + "+" + b + "+" + c);
numWays++;
}
}
}
}
return numWays;
}
答案 4 :(得分:0)
在我看来,假设只需要支持40个值,TopCoder问题的最佳解决方案是在预先计算的向量中进行查找。没有什么可以击败它(它既超快又超紧凑):
int Table[41]= { 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 3, 1, 6, 1, 7, 3, 7, 3, 14, 3, 15, 6, 14, 6, 25, 6, 22, 10, 25, 9, 42, 8, 34, 15, 37, 15, 53, 13, 48, 22, 53 };
return Table[Num];
该表可以根据需要以低效计算(我使用了简单的Python脚本)。
import fractions
for k in range(40 + 1):
T= 0
for a in range(1, k + 1):
for b in range(1, k + 1):
for c in range(1, k + 1):
if a < b and b < c and a + b + c == k and fractions.gcd(a, b) == 1 and fractions.gcd(b, c) == 1 and fractions.gcd(c, a) == 1:
T+= 1
print T