将任意整数N分解成多个互不相同的正整数的和,并打印所有可能的组合方式。...

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值