整数划分
#include<iostream>
using namespace std;
void p( int divide, int v,int n, int a[]){ //打印所有划分情况,divide是最大划分数,v是数组
if( divide > n ) //下标,n是待划分数
divide = n; //最大划分数永远不大于被划分数
for( int i = divide; i >=1; i-- ){
if( n == i){ //一种划分情况完成,打印数组
a[v]=i;
cout<<a[0];
for( int j=1;j<=v;j++)
cout<<"+"<<a[j];
cout<<";"<<endl;
}else {
a[v]=i; //划分未结束,保存路径,递归下一个划分数
p(i,v+1,n-i,a);
}
}
}
int q( int n, int m ){
if((n<1)||(m<1))return 0;
if((n==1)||(m==1))return 1;
if(n<m)return q(n,n);
if(n==m)return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
int main()
{
int n,*a;
cin>>n;
while( n<=0 ){
cout<<"请输入一个正整数:";
cin>>n;
}
a=new int[n];
cout<<"一共有"<<q(n,n)<<"种划分:"<<endl;
p(n,0,n,a);
delete[] a;
system("pause");
return 0;
}
世上无难事,只要肯登攀。

浙公网安备 33010602011771号