python實現整數分為幾個數的和(原創+詳解)
阿新 • • 發佈:2019-01-07
python實現整數分為幾個數的和
問題重述:
如何實現整數分為幾個數的和,可以理解為一個整數的分箱問題
簡單敘述解題思路:
比如:4這個整數,最多分為4個箱(1,1,1,1);最少一個箱(4)
所以我們定義一個長度為四的陣列,每個陣列最大能取到4(所以想到5進位制),開始迴圈遍歷(四個元素之和等於4即滿足條件)
0001
0002
0003
0004(滿足)
0010
0011
0012
0013(滿足)
0014
0020
......
4440
4441
4442
4443
4444
當然啦這過程中會有重複的分箱,比如
0004
0040
0400
4000
所以在寫程式的時候把滿足相加等於4的元素,把含有0的全部彈出來,之後再出重就得到答案了。
廢話不多說,程式碼實現如下:
程式中的a的就是我們輸入的一個整數值,這裡的a取list的長度
#-*-encoding=utf-8-*- import itertools from itertools import product import numpy as np def max_values(n,x): max_value=0 iters=np.arange(0,x,1) for i in iters: max_value= np.power((n-x+2),i)*(n-x+1)+max_value return max_value def min_values(n,x): min_value=0 iters=np.arange(0,x,1) for i in iters: min_value= np.power((n-x+2),i)*1+min_value return min_value def f(n,x): a=range(1,30,1) b=[] while True: s=n//x y=n%x b=b+[y] if s==0: break n=s b.reverse() b=list(b) return b x=[1,2,3,4] #a的長度就是我們輸入的一個整數值,這裡我取list的長度代替這個數 a=list(set(x)) iters=np.arange(1,a.__len__()+1,1) contianer=list() discontianer=list() count=0 for i in iters: for j in (np.arange(min_values(a.__len__(),i),max_values(a.__len__(),i)+1,1)): b=f(j,a.__len__()-i+2) if sum(b)==a.__len__() and (0 not in b): contianer.append(tuple(sorted(b))) discontianer=list(set(contianer)) print(discontianer)
輸出結果
再試一下5的
喜歡的朋友請點贊哦,方法原創的