生成整数的三元组

时间:2014-09-01 12:19:35

标签: java algorithm

我们有3个正整数a,b和c,其中a + b + c = k,其中k是任意正整数。

是否有最佳方法来迭代这三个整数的可能配置?

非常感谢任何伪代码或Java代码。

5 个答案:

答案 0 :(得分:2)

您可以为ab使用两个循环,但是您无需迭代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
    ...

此解决方案假设

    允许
  • 0;
  • 命令很重要,f.i。 (1,2,3)和(2,1,3)是两种不同的解决方案。

答案 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