1. 程式人生 > >python實現整數分為幾個數的和(原創+詳解)

python實現整數分為幾個數的和(原創+詳解)

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的

喜歡的朋友請點贊哦,方法原創的