`

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

    博客分类:
  • C++
阅读更多


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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics