程序员面试题精选(44):整数分割(即求一个数N由小于等于N的数相加所得的所有组合)

题目描述:比如给定一整数4,其有如下情况:4=4;

                                                                                  4=3+1;

                                                                                  4=2+2;

                                                                                 4=2+1+1;

                                                                                 4=1+1+1+1;

下面便是两种版本的分割实现代码。

#include "stdio.h"

 int  Compute( int  number,  int  maximum)
  {
     if  (number  ==   1   ||  maximum  ==   1 )
         return   1 ;
     else   if  (number  <  maximum)
         return  Compute(number, number);
     else   if  (number  ==  maximum)
         return   1   +  Compute(number, maximum  -   1 );
     else
         return  Compute(number, maximum  -   1 )  +  Compute(number  -  maximum, maximum);
 }
 
 int  IntPartionNo( int  n)///求组合总数版本;
 {
     return  Compute(n, n);
}

 int  IntegerPartition( int  n)///求组合总数并打印出所有情况版本;
 {
     int   * partition  =   new   int [n]();
     int   * repeat  =   new   int [n]();
 
  partition[ 1 ]  =  n;
  repeat[ 1 ]  =   1 ;
     int  count  =   1 ;
     int  part  =   1 ;
 
     int  last, smaller, remainder;
 
  printf( " %3d " , partition[ 1 ]);
     do 
  {
   last  =  (partition[part]  ==   1 )  ?  (repeat[part -- ]  +   1 ) :  1 ;
   smaller  =  partition[part]  -   1 ;
         if  (repeat[part]  !=   1 )
             -- repeat[part ++ ];
   partition[part]  =  smaller;
   repeat[part]  =   1   +  last  /  smaller;
  
         if  ((remainder  =  last  %  smaller)  !=   0 )
   {
    partition[ ++ part]  =  remainder;
    repeat[part]  =   1 ;
   }
  
         ++ count;
  
   printf( " /n " );
         for  ( int  i  =   1 ; i  <=  part;  ++ i)
             for  ( int  j  =   1 ; j  <=  repeat[i];  ++ j)
     printf( " %3d " , partition[i]);
   
  }   while (repeat[part]  !=  n);
 
     if  (partition)
  {
   delete [] partition;
   partition  =   0 ;
  }
     if  (repeat)
  {
   delete [] repeat;
   repeat  =   0 ;
  }
 
     return  count;
}

int main()
{
 printf("%d/n",IntPartionNo(4));
 IntegerPartition(4);
 getchar();

你可能感兴趣的:(程序员面试题精选(44):整数分割(即求一个数N由小于等于N的数相加所得的所有组合))