其实思路很简单,就是几个函数实现几个功能。
此题核心算法是卡特兰数,百度上的推理是:
简单来说,就是判断后实现(m+n)*(m-n+1)/(m+1);
#include
#include
using namespace std;
#define MAX 100
#define BASE 10000
void multiply(int a[],int Max,int b) //大数乘小数
{
int i,array=0;
for (i=Max-1; i>=0; i--)
{
array+=b*a[i];
a[i] = array%BASE;
array /= BASE;
}
}
void divide(int a[], int Max, int b) //大数除小数
{
int i,div=0;
for (i=0;i> M >> N , M + N )
{
printf ( "Test #%d:\n",ca++ );
if ( N > M )
{
puts ( "0" );
continue;
}
memcpy ( res , fact[M+N] , MAX * sizeof ( int ) ); //阶乘 ( m + n )!
multiply ( res, MAX, M - N + 1 ); // ( m + n )! * ( m-n+1 )
divide ( res, MAX, M + 1 ); // ( m + n )! * ( m-n+1 ) / ( m+ 1 )
outPut ( res );
}
return 0;
}
不过很奇怪的是进位(BASE)必须要在5和9之间才能AC,试了很多遍,太郁闷了!