整数划分

 

 

#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;
}

  

posted @ 2013-11-22 20:52  偶尔会寂寞  阅读(212)  评论(0编辑  收藏  举报