将一个整数划分为非负整数的部分

比如,4=1+1+1+1=1+1+2=1+2+1=1+3=2+1+1=2+2=3+1=4

总共有8种方法,一般的,证书n有2n-1种划分方法,可以设计一种方法,按照字典序将所有的划分方法都输出来。

其中的思路为,给定一个n,使用一个长度为n的数组,初始化每个元素为1,每次将低位的元素分出一个元素出来,加到相邻的高位上面。

 1 void part(int n, int* as, void (*fn)(int,int*))
 2 {
 3         int j;
 4         int i;
 5         for(j=0;j<n;j++)
 6                 as[j]=1;
 7         j=n-1;
 8 repeat:
 9         fn(j+1,as);
10         if(j == 0) return;
11         as[j-1]++;
12         j--;
13         if(as[j+1] > 1)
14         {
15                 i=as[j+1]-1;
16                 as[j+1]=1;
17                 j+=i;
18         }
19         goto repeat;
20 }


测试的例子当n=6的时候的结果为

1 1 1 1 1 1
1 1 1 1 2
1 1 1 2 1
1 1 1 3
1 1 2 1 1
1 1 2 2
1 1 3 1
1 1 4
1 2 1 1 1
1 2 1 2
1 2 2 1
1 2 3
1 3 1 1
1 3 2
1 4 1
1 5
2 1 1 1 1
2 1 1 2
2 1 2 1
2 1 3
2 2 1 1
2 2 2
2 3 1
2 4
3 1 1 1
3 1 2
3 2 1
3 3
4 1 1
4 2
5 1
6

转载于:https://www.cnblogs.com/mathlover/archive/2012/10/29/2745309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值