2017-10-21 188 views
-1

现在我有一个代码,它可以使用大于零且小于该值的数字找到值的总和的组合数。 我需要改变这个值,以扩大组合,以便它们不仅包含值。如何使100 = 1? (解释内)

例如: 数字10得到的结果: [1,2,3,4],[1,2,7], [1,3,6],[1,4,5] , [1,9],[2,3,5],[2,8], [3,7],[4,6] 但我需要扩大到包括任何数字崩溃为1作为好。因为从本质上讲,我需要100 = n,因为数字内个体数字的总和= n。所以在这种情况下,100 = 1,因为100 - > 1 + 0 + 0 = 1 因此,数字1999也将是一个有效组合,列出值= 100,因为1999 = 1 + 9 + 9 + 9 = 28, 28 = 2 + 8 = 10,并且10 = 1 + 0 = 1

现在我意识到这将产生无限的一系列组合,所以我需要设置限制范围来获取数据。这是我用来查找我的组合的当前代码。

def a(lst, target, with_replacement=False): 
    def _a(idx, l, r, t, w): 
     if t == sum(l): r.append(l) 
     elif t < sum(l): return 
     for u in range(idx, len(lst)): 
      _a(u if w else (u + 1), l + [lst[u]], r, t, w) 
     return r 
    return _a(0, [], [], target, with_replacement) 

for val in range(100,101): 
    s = range(1, val) 
    solutions = a(s, val) 
    print(solutions) 
    print('Value:', val, "Combinations", len(solutions)) 
+0

你对我们的问题到底是什么? –

+0

我试图找到一个数字的组合,它折叠为一个整数。所以n = 124会折叠为7,因为数字内的整数之和= 7,1 + 2 + 4 = 7。在这种情况下,数字124对于n = 7是有效的组合。另一个可接受的组合是601,因为整数加起来为7,6 + 0 + 1 = 7。同样的情况下,步骤,1285是一个可接受的组合,因为1 + 2 + 8 + 5 = 16,然后在那里形成1 + 6 = 7. –

+0

是的,我明白你在做什么。但是你问我们什么?你想让我们为你写代码来完成你的目的吗?还是你有更具体的问题? –

回答

0

您似乎有多个问题。

要重复添加整数的十进制数字,直到以单个数字结尾,可以使用此代码。

d = val 
while d > 9: 
    d = sum(int(c) for c in str(d)) 

这会按照您描述的方式进行操作。但是,有一个更简单的方法。重复添加一个数字的十进制数字称为casting out nines,结果为数字的digital root。除了您想要得到9而不是1的结果之外,这几乎等于除以9后的数字的其余部分。因此,更容易和更快的代码是

d = val % 9 
if d == 0: 
    d == 9 

或者可能较短,但棘手

d = (val - 1) % 9 + 1 

或偶数更棘手

d = val % 9 or 9 

发现,在7结束了所有的数字(例如,或从19的任何数字),您只需要其余的所有数字7除以9。因此,从7开始并继续添加9,您将获得所有此类值。

您使用的方法来查找7的所有分区,然后将它们排列成数字要复杂得多,速度也慢得多。

发现,在16结束了所有的数字(例如,或任何整数比9以上)您目前的做法可能是最好的。否则难以避免直接添加到725而不经过16的数字。如果这真的是你的意思,那么在你的问题中这样说,我们可以进一步看看这种情况。