整數分解爲若干項之和

7-37 整數分解爲若干項之和(20 分)

將一個正整數N分解成幾個正整數相加,能夠有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。編程求出正整數N的全部整數分解式子。html

輸入格式:

每一個輸入包含一個測試用例,即正整數N (0<N≤30)。編程

輸出格式:

按遞增順序輸出N的全部整數分解式子。遞增順序是指:對於兩個分解序列N1​​={n1​​,n2​​,⋯}和N2​​={m1​​,m2​​,⋯},若存在i使得n1​​=m1​​,,ni​​=mi​​,可是ni+1​​<mi+1​​,則N1​​序列一定在N2​​序列以前輸出。每一個式子由小到大相加,式子間用分號隔開,且每輸出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

思路:

這是一道PTA上的練習題,解決方法能夠用遞歸,由於要不斷將N分解因子,能夠想到這裏面可能有個循環。應爲提到因子要遞增的出現,全部循環內要不斷判斷當前要分解的因子是否是比上一個大。測試

代碼示例:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define MAXSTRING 100
 5 
 6 int count = 0;
 7 
 8 void Integer_Factoration(int N, int Reminder, int Start, char* STerms){
 9     int i;
10     char Tmp[MAXSTRING];
11     
12     strcpy( Tmp, STerms);
13     for( i=Start; i<=Reminder; i++){
14         if( Reminder - i > i ){
15             sprintf( Tmp+strlen(STerms), "%d+", i);
16             Integer_Factoration( N, Reminder-i, i, Tmp);
17         }
18         else if( Reminder - i == 0 ){
19             sprintf( Tmp+strlen(STerms), "%d", i);
20             count++;
21             if( count % 4 != 1 )
22               printf(";");
23             printf("%s", Tmp);
24             if( count % 4 == 0 )
25               printf("\n");
26         }
27     }
28 }
29 
30 int main(void){
31     char STerms[MAXSTRING]="";
32     
33     int N;
34     scanf("%d", &N);
35     sprintf( STerms, "%d=", N );
36     Integer_Factoration( N, N, 1, STerms);
37     
38     return 0;
39 }

代碼中count來統計當前已有的分解式個數,從而來控制打「;」仍是換行。spa

Integer_Factoration完成總體功能。參數1:要分解的數;參數2:分解後剩餘值,初始爲N(未分解);參數3:上一個分解因子值,初始爲1,參數4:保存每次分解的結果。code

函數開始前,先將參數4的值copy,而非直接對參數修改,如此才能保證遞歸實例每項都是獨立的。循環完成尋找合適的因子的功能。htm

循環中,判斷當前剩餘項減去一個因子後剩餘值是否已經比前一個因子(Start)大?是的話,由於還能夠繼續分解因子,進第一個分支;不是的話,就判斷是否減去當前因子就等於零,是的話說明已獲得一個分解式,將其打印;不是的話,則說明前一個因子(start)分解不合理,從新分解。blog

相關文章
相關標籤/搜索