题目描述:比如给定一整数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();
}