生成总和为N的所有可能的3个正整数

时间:2014-03-20 12:27:38

标签: php algorithm math probability

我对数学并不擅长,而且我无法解决这个问题,我想生成每个可能的3个正数,例如,这个总数为N,例如:

0 - 0 - 100

0 - 1 - 99

1 - 1 - 98

你不需要用PHP代码回答我,只是对如何生成这些数字的一般概念就足够了。

感谢。

3 个答案:

答案 0 :(得分:4)

暴力是您的选择:您可以使用 2个嵌套循环 并且它只需要 10000 测试。

  // pseudo code
  for (i = 0; i <= 100; ++i)
    for (j = 0; j <= 100; ++j) {
      if ((i + j) > 100)
        break;

      k = 100 - i - j;

      print(i, j, k); 
    } 

如果重复,例如0, 0, 1000, 100, 0排除,您可以使用稍加修改的代码:

  // pseudo code
  for (i = 0; i <= 100; ++i)
    for (j = i; j <= 100; ++j) {
      if ((i + j) > 100)
        break;

      k = 100 - i - j;

      if (j <= k)
        print(i, j, k); 
    } 

答案 1 :(得分:0)

另一种方法,时间复杂度稍好一些。

n=int(input())
for i in range(0,int(n/2+1)):
    for j in range(0,int(i/2+1)):
        print(j," ",i-j," ",(int)(n-i))
    l=n-i
    for j in range(0,int((n-i)/2+1)):
        print(j," ",l-j," ",(int)(i))

这只是该算法的扩展,它产生两个数,其和等于n

n=int(input())
for i in range(0,int(n/2+1)):
    print(i," ",n-i)

我发现你需要那些重复项,只需在第2,3和6行中将限制更改为完整

n=int(input())
for i in range(0,n):
    for j in range(0,i):
        print(j," ",i-j," ",(int)(n-i))
    l=n-i
    for j in range(0,l):
        print(j," ",l-j," ",(int)(i))

答案 2 :(得分:0)

至于一个算法,首先考虑总和小于或等于100的数字对。这些应该很容易列出。即

   0      1      2                 100
{{0,0}, {0,1}, {0,2},.........., {0,100}
               {1,1}, {1,2},..., {1,99}
 .
 .
 ...............................{50,50}}

然而,这些对中的每一对,也可以与一个数字配对,使得整个三元组总和为100。

总结一下;如果你能首先列出这些对的列表(在[0,100]中需要一个双循环,在[0:50]中需要j);然后循环遍历此列表中的所有对,计算第三个数字,您应该获得所有三元组而不重复。此外,如果正确完成,您根本不需要任何列表,通过适当的循环索引,您可以计算它们的位置。

编辑注意到您想要重复 - (尽管您可以对每个三元组进行置换)。