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