5 37 整數分解為若干項之和

2021-07-26 06:50:46 字數 2665 閱讀 3220



將乙個正整數n分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數n的所有整數分解式子。

每個輸入包含乙個測試用例,即正整數n (0<<

<

n≤\le

≤30)。

按遞增順序輸出n的所有整數分解式子。遞增順序是指:對於兩個分解序列n1=n_1=n​

1​​=

和n2=n_2=n​

2​​=

,若存在ii

i使得n1=m1,⋯,ni=min_1=m_1, \cdots , n_i=m_in​

1​​=

m​1​

​,⋯,

n​i​

​=m​

i​​,但是ni+1n​

i+1​

​i+1​

​,則n1n_1n​

1​​序列必定在n2n_2n​

2​​序列之前輸出。每個式子由小到大相加,式子間用分號隔開,且每輸出4個式子後換行。

7
7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2

7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2

7=1+2+4;7=1+3+3;7=1+6;7=2+2+3

7=2+5;7=3+4;7=7

解題思路:

採用了深度優先處理的思想,涉及到了一點點資料結構的知識。如果還沒學到資料結構,也不必擔心。在之前的題目中也可能用到了其它容易實現的資料結構,只是不知道它是資料結構中的內容。資料結構就是把各種各樣的操作、邏輯關係進行分類、總結,從而讓我們更加方便地設計演算法來解決問題。

深度優先演算法用遞迴寫起來比較方便。遞迴有兩個重要元素:

遞迴對技巧性要求很高,大多數時候其關係式並不是很容易找到。而且對遞迴的設計與理解,很容易鑽到具體細節的實現上。遞迴的優點就是可以讓一些複雜問題簡單化,把具體的細節交給計算機執行。而過分鑽研細節,就非常容易陷進去理不清頭緒。對於遞迴的學習應該是多看看經典的遞迴寫法,遇到類似問題會模仿寫就行了,不一定要自己創造出乙個遞迴關係式。

本題也是如此。注意演算法的主體部分,關鍵資訊無非是:

void

division

()

遞迴出口是累加的總和等於了輸入的 n。

到這裡,就可以去看下面的**了。然後試著自己寫,不會寫,就模仿,下面的框圖對寫這個演算法基本上沒有幫助——除了讓人覺得「好像挺複雜的」以外。遞迴的特點就是形式簡單,實際上細節繁多。不要扣於細節,先會寫了,再去思考和模擬它的執行細節以掌握它,這樣才不至於困難重重,無從下手。如果細節上有疑問,可以來看看下面的處理流程。

演算法的處理流程是:

第一層遞迴

第二層遞迴

第三層遞迴

主要執行細節

division (1)

sum = 1,不跳出division (1)

sum = 2,不跳出division (1)

sum = 3 等於 n,輸出當前序列 1 1 1,

跳出,執行 for 迴圈,sum 均大於 3,跳出,返回上一層第三層

s[0] s[1] s[2] 動作

1 1 1輸出

1 1 2 跳出

1 1 3 跳出

1 1 4 跳出

開始處理

division (2)

sum = 3,輸出當前序列 1 2,然後跳出,執行 for 迴圈,均跳出

返回至上一層

返回至上一層

第二層s[0] s[1] 動作

1 2輸出

1 3 跳出

1 4 跳出

開始處理 division (2)

sum = 2,不跳出division (2)

sum = 4,跳出,返回上一層

第二層s[0] s[1] 動作

2 2 跳出

開始處理 division (3)

sum = 3,輸出當前序列 3,結束程式

返回至上一層

第一層s[0] 動作

3 跳出

如果 n 更大一點,這個**會變得更加複雜。遞迴的手動模擬範圍應盡量小一點,否則容易混亂。

解題**:

#includeint n;

int s[31]; // 存放劃分結果

int top = -1; // 陣列指標

int count = 0; // 統計輸出的次數

int sum = 0; // 拆分項累加和

void division (int i);

int main ()

void division (int i)

for (int j=i; j<=n; j++) // 演算法主體

}

引自:



5 37 整數分解為若干項之和

7 37 整數分解為若干項之和 20 分 將乙個正整數n分解成幾個正整數相加,可以有多種分解方法,例如7 6 1,7 5 2,7 5 1 1,程式設計求出正整數n的所有整數分解式子。每個輸入包含乙個測試用例,即正整數n 0按遞增順序輸出n的所有整數分解式子。遞增順序是指 對於兩個分解序列n 1 和n...

整數分解為若干項之和

將乙個正整數n分解成幾個正整數相加,可以有多種分解方法,例如7 6 1,7 5 2,7 5 1 1,程式設計求出正整數n的所有整數分解式子。輸入格式 每個輸入包含乙個測試用例,即正整數n 0輸出格式 按遞增順序輸出n的所有整數分解式子。遞增順序是指 對於兩個分解序列n 1 和n 2 若存在i使得n ...

整數分解為若干項之和

將乙個正整數n分解成幾個正整數相加,可以有多種分解方法,例如7 6 1,7 5 2,7 5 1 1,程式設計求出正整數n的所有整數分解式子。每個輸入包含乙個測試用例,即正整數n 0 30 按遞增順序輸出n的所有整數分解式子。遞增順序是指 對於兩個分解序列n 1 和n 2 若存在i使得n 1 m 1 ...