将正整数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。
输入一个正整数,给出不同的划分,并求出总数。
#include<iostream.h>
int d[50],sum=0;
void huafen(int m,int n,int k) //将m分解为不大于n的组成数,k>=0是下标
{
inti;
if(0==m) //当m为0是表示得到一个划分,进行输出
{
sum++; //用来累计有多少种,并在最后输出。
for(i=0;i<k;i++)
{
cout<<d[i];
if(i<k-1)
cout<<"+";
}
cout<<endl;
}
for(i=(m<n? m:n);i>0;i--)//深度探索分解分解,大家可以适当输出m,n和K帮助理解递归
{
d[k]=i;
huafen(m-d[k],d[k],k+1); //递归分解,直到得到一个划分
}
}
void main()
{
intn;
cout<<"请输入要划分的数: ";
cin>>n;
huafen(n,n,0);
cout<<n<<"共有"<<sum<<"种不同划分"<<endl;
}