获取所有加起来的数字

Sam*_*hin 20 python math

我正在尝试找到一种方法来显示加起来给定整数的所有可能的X整数集.例如,要获得5个我将拥有的所有2个整数集:

1, 4
2, 3
Run Code Online (Sandbox Code Playgroud)

或者对于产生6的3个整数:

1, 1, 4
1, 2, 3
2, 2, 2
Run Code Online (Sandbox Code Playgroud)

我只需要整数不包括0,它只需要在一组中最多可以工作15次,最多可以工作30次.数.

我甚至不确定这是否有一个数学术语.我觉得它与分解相似吗?

Jas*_*rff 19

这是解决此问题的一种方法:

def sum_to_n(n, size, limit=None):
    """Produce all lists of `size` positive integers in decreasing order
    that add up to `n`."""
    if size == 1:
        yield [n]
        return
    if limit is None:
        limit = n
    start = (n + size - 1) // size
    stop = min(limit, n - size + 1) + 1
    for i in range(start, stop):
        for tail in sum_to_n(n - i, size - 1, i):
            yield [i] + tail
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它.

for partition in sum_to_n(6, 3):
    print partition

[2, 2, 2]
[3, 2, 1]
[4, 1, 1]
Run Code Online (Sandbox Code Playgroud)


jbo*_*chi 9

有一个片段在这里:

from itertools import combinations, chain

def sum_to_n(n):
    'Generate the series of +ve integer lists which sum to a +ve integer, n.'
    from operator import sub
    b, mid, e = [0], list(range(1, n)), [n]
    splits = (d for i in range(n) for d in combinations(mid, i)) 
    return (list(map(sub, chain(s, e), chain(b, s))) for s in splits)
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

for p in sum_to_n(4):    
    print p
Run Code Online (Sandbox Code Playgroud)

输出:

[4]
[1, 3]
[2, 2]
[3, 1]
[1, 1, 2]
[1, 2, 1]
[2, 1, 1]
[1, 1, 1, 1]

  • 这是什么时间和空间的复杂性? (2认同)
  • 通常[1,3]和[3,1]被认为是相同的分区. (2认同)