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