將一個正整數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