卡特兰数的应用。。。提交后presentation error.........看了下题目没有什么特殊格式要处理的啊,后来把puts(" ");换成printf("\n");就过了。
我就纳闷了,原来我puts(""),引号里面多了一个空格。。。。。。以后一定要小心。
模版如下:
卡特兰数公式如下:
原理
令h(1)=1,h(0)=1,catalan数满足递归式: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2) 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为: h(n)=C(2n,n)/(n+1) (n=1,2,3,...)
View Code
1
#include
<
stdio.h
>
2 #include < stdlib.h >
3 #include < string .h >
4 int main( )
5 {
6 int r[ 60 ],n,i,j,k,t,c;
7 while (scanf( " %d " , & n) != EOF)
8 {
9 for (i = 1 ;i < 60 ;i ++ )
10 r[i] = 0 ;r[ 0 ] = j = 1 ;
11 for (i = 2 ;i <= n; ++ i)
12 {
13 for (k = 0 ;k < j; ++ k) // 大数乘法,从低位到高位
14 r[k] *= ( 4 * i - 2 ); // 乘法处理进位,c是进位值
15 for (k = c = 0 ;k < j; ++ k)
16 {
17 t = r[k] + c;
18 r[k] = t % 10 ; // 对乘法结果处理进位
19 c = t / 10 ;
20 }
21 while (c)
22 { // 乘法最高进位
23 r[j] = c % 10 ;
24 c /= 10 ;
25 ++ j;
26 }
27 for (k = j - 1 ,c = 0 ;k >= 0 ; -- k) // 大数除法,从高位到低位
28 {
29 t = c * 10 + r[k];
30 r[k] = t / (i + 1 );
31 c = t % (i + 1 );
32 }
33 while ( ! r[j - 1 ])
34 -- j; // 除法最高位
35 }
36 for (i = j - 1 ;i >= 0 ;i -- )
37 printf( " %d " ,r[i]);
38 printf( " \n " );
39
40 }
41 return 0 ;
42 }
43
44
2 #include < stdlib.h >
3 #include < string .h >
4 int main( )
5 {
6 int r[ 60 ],n,i,j,k,t,c;
7 while (scanf( " %d " , & n) != EOF)
8 {
9 for (i = 1 ;i < 60 ;i ++ )
10 r[i] = 0 ;r[ 0 ] = j = 1 ;
11 for (i = 2 ;i <= n; ++ i)
12 {
13 for (k = 0 ;k < j; ++ k) // 大数乘法,从低位到高位
14 r[k] *= ( 4 * i - 2 ); // 乘法处理进位,c是进位值
15 for (k = c = 0 ;k < j; ++ k)
16 {
17 t = r[k] + c;
18 r[k] = t % 10 ; // 对乘法结果处理进位
19 c = t / 10 ;
20 }
21 while (c)
22 { // 乘法最高进位
23 r[j] = c % 10 ;
24 c /= 10 ;
25 ++ j;
26 }
27 for (k = j - 1 ,c = 0 ;k >= 0 ; -- k) // 大数除法,从高位到低位
28 {
29 t = c * 10 + r[k];
30 r[k] = t / (i + 1 );
31 c = t % (i + 1 );
32 }
33 while ( ! r[j - 1 ])
34 -- j; // 除法最高位
35 }
36 for (i = j - 1 ;i >= 0 ;i -- )
37 printf( " %d " ,r[i]);
38 printf( " \n " );
39
40 }
41 return 0 ;
42 }
43
44