2017-10-21 189 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的數字。如果這真的是你的意思,那麼在你的問題中這樣說,我們可以進一步看看這種情況。