/*
*整数6如下有11种划分
*6=6
*6=5+1
*6=4+2;6=4+1+1
*6=3+3;6=3+2+1;6=3+1+1+1
*6=2+2+2;6=2+2+1+1;6=2+1+1+1+1
*6=1+1+1+1+1+1
*P(6)=11
*/
#include<iostream.h>
int sum=0;
/*
*sum以n递增一实现划分
*所有的加数都为相同数如2+2+2;1+1+1+1+1+1……
*当如a=6,i=3时sum=i+2+2大于a可是却可继续划分,于是(1)
*/
int fun(int n,int a)
{
sum+=n;
if(n==0)
{
cout<<endl;
return 0;
}
else
{
if(sum>a)//(1)是末尾的2划分为1+1
{
sum-=n;
n-=1;
return fun(n,a);
}
else
{
cout<<"+"<<n;
return fun(n,a);
}
}
}
int main()
{
int a=0,n=0,summ=0;
cin>>a;//输入的数
for(int i=a;i>0;i--)
{
n=a-i;//取出减去i后的得数
if(n>=i)//当n>=i(即3=3时)n最高只能是i,以免出现6=2+4的重复现象
{
n=i;
}
cout<<a<<"="<<i;
if(n==0)
{
cout<<endl;
}
sum=i;
while(n>0)//n==0进行下一次取n操作
{
summ+=1;
fun(n,a);//对n进行分解
if(n!=1)
{
cout<<a<<"="<<i;
}
sum=i;//为进行下一步处理,使sum清0
if(sum+n+1<a && i!=1 && n!=1)//为适应出现6=2+2+1+1情况使6=2+2+2中的第3个2划分
{
cout<<"+"<<n;
sum+=n;
n-=1;
fun(n,a);
sum=i;
cout<<a<<"="<<i;
summ+=1;
}
else
{
n-=1;
}
}
}
summ+=1;//6=6这一个也要算如
cout<<"P("<<a<<")="<<summ<<endl;
return 0;
}
发表于 @ 2006年08月09日 00:02:00|评论(loading...)|编辑