三个数字的组合,总计为1000

时间:2019-02-14 14:28:30

标签: python algorithm

我需要三个正整数的总和为1000。

这是我的尝试,但是我不确定这是否正确,因为我无法对其进行验证。

def getSum():
    l = []
    for x in range(1, 999):
        total = 1000-x
        for y in range(1, 999):
            total = total-y
            if total>0:
                l.append([x, y, total])
    return l

print len(getSum())

我得到28776个不同的组合。正确吗?

4 个答案:

答案 0 :(得分:6)

由于1+998+11+1+998 不是是同一件事,所以有一些令人难以置信的组合:

此行可以全部生成它们:

[(i, 1000-i-k, k) for i in range(1,999) for k in range(1,1000-i)]

结果:

[...
(1, 4, 995),
(1, 3, 996),
(1, 2, 997),
(1, 1, 998),
(2, 997, 1),
(2, 996, 2),
...]

此列表的长度为:

498501

答案 1 :(得分:2)

否,该数字不正确。您的代码存在以下问题:

        total = total-y

在这里,您尝试使用的每个total值都会使y越来越小,在减去x之后,切勿将其重置为该值。要修复此问题,请创建一个新变量,例如total2,并在内部循环中使用它。

        total2 = total-y

这样,您将获得498501个组合。另外,您可以break尽快从内部循环total2 < 0


如果您只需要组合的数字:请注意,有N-1个组合可以将两个数字加到N上,例如N==41+32+23+1(假设您认为1+33+1不同)。您可以将其扩展为三个数字,将数字分为两部分两次。这样,您只需要一个循环。可以进一步简化为O(1)公式。

示例,以product作为参考的天真的方法:

>>> N = 100  # to make reference faster
>>> sum(1 for t in product(range(1, N+1), repeat=3) if sum(t)==N)
4851
>>> sum(N-1-i for i in range(1, N-1))
4851
>>> ((N-2)*(N-1))//2
4851

当然,它也适用于N = 1000(或更大,甚至更大):

>>> N = 1000
>>> sum(N-1-i for i in range(1, N-1))
498501
>>> ((N-2)*(N-1))//2
498501

答案 2 :(得分:0)

如果您将[1,1,998]和[1,998,1]视作相同(没有唯一整数):

def getSum():
    l = []
    for x in range(1, 999):
        total = 1000-x
        for y in range(1, 999):
            total = total-y
            if total>0:
                z = [x, y, total]
                z.sort()
                if z not in l:
                    l.append(z)
return l

a = getSum()
print(len(a))

如果要3个唯一整数:

def getSum():
    l = []
    for x in range(1, 999):
        total = 1000-x
        for y in range(1, 999):
            total = total-y
            if total>0:
                z = [x, y, total]
                z.sort()
                if (z not in l) and (not((len(set(z)) < len(z)))):
                    l.append(z)
    return l

a = getSum()
print(len(a))

否则,就我而言,您的代码还可以。我还没有检查你的答案...

编辑:我已经使用野蛮力量对其进行了检查。如果对(1,1,998)和(998,1,1)的处理不同,则正确答案实际上是498501。目前我不知道为什么...

答案 3 :(得分:0)

尝试一下:

def getSum():
    l = []
    for x in range(1, 6):
        for y in range(1, 6):
            total = 6-(y+x)
            if total>0:
                s = set([x, y, total])
                if s not in l:
                    l.append(s)
                    print(x, y, total)
    return l

print (len(getSum()))

这是我的算法,尽管有更好的方法。在这种情况下,我为6号代码编写了代码,并打印了所有组合以显示其工作原理。您可以在此代码中(在3个位置)设置1000或任意数字而不是6(忽略3)。