我对数学并不擅长,而且我无法解决这个问题,我想生成每个可能的3个正数,例如,这个总数为N,例如:
0 - 0 - 100
0 - 1 - 99
1 - 1 - 98
你不需要用PHP代码回答我,只是对如何生成这些数字的一般概念就足够了。
感谢。
答案 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, 100
和0, 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);然后循环遍历此列表中的所有对,计算第三个数字,您应该获得所有三元组而不重复。此外,如果正确完成,您根本不需要任何列表,通过适当的循环索引,您可以计算它们的位置。
编辑注意到您想要重复 - (尽管您可以对每个三元组进行置换)。