整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+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+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
程序输出该整数的所有划分。
一位大神分别使用了递归和循环来做题,结果证明,还是循环比较好一点。
http://blog.csdn.net/ll_0520/article/details/7461295
View Code
1 #include<iostream> 2 #define MAX 100 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 int num[MAX] , top , sum; 9 int i , flag; 10 while(cin>>n) 11 { 12 num[0] = n; 13 top = 0; 14 cout<<num[0]<<endl; 15 for(;;) 16 { 17 sum = 0; 18 num[top]--; 19 if(num[0] == 0) break; //结束条件 20 for(i = 0; i <= top; i++) 21 sum += num[i]; //计算之前的和 22 top++; 23 num[top] = n - sum; 24 if(num[top] > num[top-1]) //消除后一项比前一项大的情形 25 { 26 while(num[top] > num[top-1]) 27 { 28 sum = 0; 29 while(num[top] > num[top-1]) 30 { 31 num[top]--; 32 } 33 for(i = 0; i <= top; i++) 34 sum += num[i]; 35 top++; 36 num[top] = n - sum; 37 } 38 } 39 for(i = 0; i <= top; i++) 40 { 41 cout<<num[i]; 42 if(i != top ) cout<<" + "; 43 } 44 flag = 0; 45 for(i = top; i >=0; i--) 46 { 47 if(num[i] > 1) 48 {top = i; flag = 1; break;} 49 } 50 if(!flag) top = 0; // 考虑数组中都为1的情况 51 if(top >= 1)cout<<" , "; //该行情况没有枚举完毕 52 else cout<<endl; 53 } 54 } 55 return 0; 56 }