#include<iostream.h>
int d[1000],num;
long number;
void divide(int k,int n)
{
int i,j;
for(i=d[k-1]+1;i*2<n;i++)
{
d[k]=i;
if((n-i)>d[k]*2)
divide(k+1,n-i);
d[k+1]=n-i;
number++;
cout<<endl<<"NO."<<number<<"=";
for(j=1;j<=k;j++)
cout<<d[j]<<"+";
cout<<d[j];
}
}
void main()
{
int i,j;
cout<<"Input the number to divide:";
cin>>num;
d[0]=0;
divide(1,num);
}
第二种算法:
#include <iostream>
#include <ctime>
using namespace std;
int count1=0;
void print(int b[],int n)
{
int j;
count1++;
cout<<n+1<<"=";
for(j=0;j<n-1;j++)
if(b[j]!=0)
{ cout<<b[j];break;}
for(j=j+1;j<n;j++)
if(b[j]!=0)
cout<<"+"<<b[j];
cout<<endl;
}
void GetPowerSet(int i,int a[],int b[],int n)
{
//功能:求以数组a[i,..,n-1]中元素为集合中元素的集合的冥集
//在对字符串中元素进行运算时要注意字符串的结束符'\0'也算是集合中的元素
//具体处理的方法见上例
int j,sum=0;
if(i==n)
{
for(j=0;j<n;j++)
sum+=b[j];
if(sum==n+1) print(b,n);
}
else
{
for(j=0;j<n;j++)
sum+=b[j];
if(sum==n+1)
print(b,n);
if(sum<n+1)
{
b[i]=a[i]; GetPowerSet(i+1,a,b,n);
b[i]=0; //b[i]所重新赋的值必须是a中不曾出现的元素
GetPowerSet(i+1,a,b,n);
}
}
}
int main()
{
int N;
time_t time1,time2;
cout<<"输入你要分解的数字:";
cin>>N;
time1=time(NULL);
int *a=new int[N-1];
int *b=new int[N-1];
for(int i=0;i<N-1;i++)
{ a[i]=i+1; b[i]=0;
}
GetPowerSet(0,a,b,N-1);
cout<<"有"<<count1<<"种分解方法"<<endl;
time2=time(NULL);
cout<<difftime(time2,time1)<<"花费";
system("pause");
return 0;
}
int d[1000],num;
long number;
void divide(int k,int n)
{
int i,j;
for(i=d[k-1]+1;i*2<n;i++)
{
d[k]=i;
if((n-i)>d[k]*2)
divide(k+1,n-i);
d[k+1]=n-i;
number++;
cout<<endl<<"NO."<<number<<"=";
for(j=1;j<=k;j++)
cout<<d[j]<<"+";
cout<<d[j];
}
}
void main()
{
int i,j;
cout<<"Input the number to divide:";
cin>>num;
d[0]=0;
divide(1,num);
}
第二种算法:
#include <iostream>
#include <ctime>
using namespace std;
int count1=0;
void print(int b[],int n)
{
int j;
count1++;
cout<<n+1<<"=";
for(j=0;j<n-1;j++)
if(b[j]!=0)
{ cout<<b[j];break;}
for(j=j+1;j<n;j++)
if(b[j]!=0)
cout<<"+"<<b[j];
cout<<endl;
}
void GetPowerSet(int i,int a[],int b[],int n)
{
//功能:求以数组a[i,..,n-1]中元素为集合中元素的集合的冥集
//在对字符串中元素进行运算时要注意字符串的结束符'\0'也算是集合中的元素
//具体处理的方法见上例
int j,sum=0;
if(i==n)
{
for(j=0;j<n;j++)
sum+=b[j];
if(sum==n+1) print(b,n);
}
else
{
for(j=0;j<n;j++)
sum+=b[j];
if(sum==n+1)
print(b,n);
if(sum<n+1)
{
b[i]=a[i]; GetPowerSet(i+1,a,b,n);
b[i]=0; //b[i]所重新赋的值必须是a中不曾出现的元素
GetPowerSet(i+1,a,b,n);
}
}
}
int main()
{
int N;
time_t time1,time2;
cout<<"输入你要分解的数字:";
cin>>N;
time1=time(NULL);
int *a=new int[N-1];
int *b=new int[N-1];
for(int i=0;i<N-1;i++)
{ a[i]=i+1; b[i]=0;
}
GetPowerSet(0,a,b,N-1);
cout<<"有"<<count1<<"种分解方法"<<endl;
time2=time(NULL);
cout<<difftime(time2,time1)<<"花费";
system("pause");
return 0;
}