Python實現整數劃分

2021-10-04 06:52:15 字數 1765 閱讀 3116

整數劃分,是指把乙個正整數n表示成系列正整數之和:

例如正整數6有如下11種不同的劃分,所以p(6)=11

6

5+14+2,4+1+1

3+3,3+2+1,3+1+1+1

2+2+2,2+2+1+1,2+1+1+1+1

1+1+1+1+1+1

我把上述每種數字定義為6的劃分因子,可知,6有6種劃分因子,每種都有可能組成6。於是可以用乙個for迴圈來依次遍歷劃分因子。比如從1開始,1是第一位組成6的數,那麼還剩rest = 6-1.再對rest進行同樣分析,也就是遞迴。遞迴終止條件為當rest = 0時,6被分完了,就輸出。此時需要乙個資料結構來儲存合適的劃分因子,從這裡遍歷輸出。最後,為了去重,在遞迴後回溯時,加個if判斷,規定滿足:在資料結構裡儲存的劃分因子,當要儲存新的劃分因子之前,判斷該劃分因子比上一位(下標-1)不小於時才能允許存入。

# 用python字典這個資料結構儲存劃分因子,從1開始,用0佔位

dividing_number =

# 次數累加變數

times =

0def

int_divide

(number, index)

:global times

# 從1開始遍歷該整數所有劃分因子

for i in

range(1

, number+1)

:# 與前一位劃分因子比較,去重,如先有24,42則不行

if i >= dividing_number[index-1]

: dividing_number[index]

= i # 當前數-劃分因子後還剩數,如6-1剩5

number_rest = number - i

# 整數被劃分完畢

if number_rest ==0:

# 輸出劃分因子

for j in

range(1

, index)

:print

(str

(dividing_number[j])+

'+', end='')

print

(str

(dividing_number[index]))

times = times +

1# 未被劃分完畢,繼續,dividing_number劃分位數+1

else

: int_divide(number_rest, index+1)

else

:pass

n =int

(input

("請輸入乙個整數\n"))

int_divide(n,1)

print

("所以該整數的劃分數為:%d"

% times)

為什麼選擇字典呢,因為字典是雜湊表類的乙個實現,搜尋效率較高

請輸入乙個整數

6

1+1+1+1+1+1

1+1+1+1+2

1+1+1+3

1+1+2+2

1+1+4

1+2+3

1+52+2+2

2+43+3

6所以該整數的劃分數為:11

學生初習演算法,若本文有不對之處, 或有大牛有更優解,或對學生有好的建議,敬請賜教,感激不盡

整數劃分問題java實現

public class integerdivision 將n劃分為最大整數不超過m的組合 param n要劃分的整數 param m return可能的組合個數 public static int q int n,int m 不超過0的組合個數為0或者0不能被劃分 if n 0 m 0 不超過m ...

python整數劃分,遞迴演算法

正整數n,n m1 m2 mk,其中mi為正整數,並且1 mi n,集合是整數n的乙個劃分。輸入乙個不小於10的整數,輸出其所有整數劃分。將整數n劃分,假設某種劃分中m為最大的整數,則 n可分為n m,m,n m 再由 m 1 劃分 n m 可分為 n m m 1 m 1 n m m 1 再由 m ...

整數劃分(劃分dp)總結

寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...