整数的分划问题。

整数的分划问题。 

如,对于正整数n=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,编写算法打印所有划分。

用户从键盘输入 (范围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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值