整数划分
庄心妍好听的歌-风采楼
整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
另:给出所有不同划分的情况。
例如正整数6有如下11种不同的划分:
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。
输入一个正整数,给出不同的划分,并求出总数。
(赖晓晖: 如果有错误请大家批评指出,
谢谢)
思路:是以二叉树的的思路做的,(用二叉树应该也可以做,可能在输出要判断有点麻烦。)
以6为例子:分为6种情况,而每种情况又有不同的子情况。
6
6
6
4 2
1
5
1 1
(1):6 (2)5+1 (3)4+2
4+1+1
6
6
3
3
2
4
1
2
2
2
1
1
1 1
1
1
(4)3+3 3+2+1 3+1+1+1
(5)2+2+2 2+2+1+1 2+1+1+1+1
(6)1+1+1+1+1+1
如果左子树K小于右子树P,让P的右子树的的左子树以k倍数分下去。
源代码:
#include
int
a[50],sum=0;
void huafen(int m,int n,int ai)
将m分为不大于n的组成数,ai>=0是下标
{
ut<<
去掉注释可以清楚看到递归时的各个变量具体变化情况
int i;
if(0==m) 当m为0是表示得到一个划分,进行输出
{
sum++;
用来累计有多少种,并在最后输出。
for(i=0;i
cout< if(i
}
cout<
for(i=(m
{
t<<
ut<<
ut<<
ut<<
a[ai]=i;
t<<
huafen(m-a[ai],a[ai],ai+1);
递归分解,直到得到一个划分
}
}
void main()
{
int n;
cout<<请输入要划分的数:
cin>>n;
huafen(n,n,0);
cout<