我好不容易想起了一個解決方案(假設itertools
已經導入):
def reduct(length, n=5):
return [i for i in \
itertools.combinations_with_replacement(range(1, 10), length) \
if ((sum(i) - 1) % 9 + 1) == n]
這將返回所有獨特的組合是「減少」到n
,這是5
默認。
說明:
itertools.combinations_with_replacement(range(1, 10), length)
產生(不包括0
)length
一個數字號碼的所有唯一組合。請參閱documentation。
((sum(i) - 1) % 9 + 1)
產生的每一種組合的「還原」。它使用digital root式((n - 1) % 9 + 1
,與n
如在組合中的數字的總和。
- 其餘部分是自我解釋(我希望)。
一些測試運行:
>>> reduct(2)
[(1, 4), (2, 3), (5, 9), (6, 8), (7, 7)]
>>> reduct(3)
[(1, 1, 3), (1, 2, 2), (1, 4, 9), (1, 5, 8), (1, 6, 7), (2, 3, 9),
(2, 4, 8), (2, 5, 7), (2, 6, 6), (3, 3, 8), (3, 4, 7), (3, 5, 6),
(4, 4, 6), (4, 5, 5), (5, 9, 9), (6, 8, 9), (7, 7, 9), (7, 8, 8)]
>>> len(reduct(7))
715
指定自定義n
:
>>> reduct(2, 8)
[(1, 7), (2, 6), (3, 5), (4, 4), (8, 9)]
>>> reduct(3, 8)
[(1, 1, 6), (1, 2, 5), (1, 3, 4), (1, 7, 9), (1, 8, 8), (2, 2, 4),
(2, 3, 3), (2, 6, 9), (2, 7, 8), (3, 5, 9), (3, 6, 8), (3, 7, 7),
(4, 4, 9), (4, 5, 8), (4, 6, 7), (5, 5, 7), (5, 6, 6), (8, 9, 9)]
>>> len(reduct(7, 8))
715
什麼長度的限制?你想要所有的解決方案還是隻需要計數? – marcadian
長度將通過「的raw_input」來指定。它可以是任何數字。所以,我想知道函數的長度是多少,只是爲了看看它是如何工作的:)。 –
你是說長度沒有限制嗎? – marcadian