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

比如,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

posted on 2012-10-29 20:22  mathlover  阅读(229)  评论(0编辑  收藏  举报

导航