7-37 整數分解為若干項之和(20 分)
將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。編程求出正整數N的所有整數分解式子。
輸入格式:
每個輸入包含一個測試用例,即正整數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來統計當前已有的分解式個數,從而來控制打“;”還是換行。
Integer_Factoration完成整體功能。參數1:要分解的數;參數2:分解后剩余值,初始為N(未分解);參數3:上一個分解因子值,初始為1,參數4:保存每次分解的結果。
函數開始前,先將參數4的值copy,而非直接對參數修改,如此才能保證遞歸實例每項都是獨立的。循環完成尋找合適的因子的功能。
循環中,判斷當前剩余項減去一個因子后剩余值是否已經比前一個因子(Start)大?是的話,因為還可以繼續分解因子,進第一個分支;不是的話,就判斷是否減去當前因子就等於零,是的話說明已得到一個分解式,將其打印;不是的話,則說明前一個因子(start)分解不合理,重新分解。
