UVa 485 Pascal's Triangle of Death

大整数,主要是设计好怎么加,结果怎么保存,进位的处理要特别小心。

 

code
   
     
1 // 72ms 2010-05-18 9:09:03
2   // Type: Big integer(杨辉三角)
3   // key1: 数位不同的两数相加时,要特别处理
4   // key2: flg 标记位数是否达到61, 刚开始main()函数里也定义的一个 flg,于是就死循环,add()函数的改变没有影响main()
5   #include < stdio.h >
6 #include < string .h >
7   #define MAX(x,y) ((x)>(y)?(x):(y))
8   #define MIN(x,y) ((x)<(y)?(x):(y))
9   #define NL 100
10 #define EX 10
11
12 int itg[NL * 10 ][NL];
13 int rev[NL]; // 保存
14 bool flg;
15
16 void add( int k)
17 {
18 int tmp[NL];
19 int M, x, y;
20 for (M = 0 ; M <= itg[k][ 0 ]; M ++ ) {
21 tmp[M] = itg[k][M];
22 }
23 y = 0 ;
24 int L = MAX(itg[k][ 0 ], rev[ 0 ]); // 求出最大的数位
25 int X = MIN(itg[k][ 0 ], rev[ 0 ]); // 求出最小的数位
26 bool f0 = 0 ;
27 if (itg[k][ 0 ] == X) f0 = 1 ;
28 // key1
29 for (M = 1 ; M <= L; M ++ ) {
30 if (M > X) {
31 if (f0) { x = rev[M] + y; } // 当 M >= X && M <= L 时,处理
32 else x = itg[k][M] + y;
33 } else {
34 x = itg[k][M] + rev[M] + y;
35 }
36 itg[k][M] = x % EX;
37 y = x / EX;
38 }
39 itg[k][ 0 ] = L;
40 if (y > 0 ) {
41 itg[k][M] = y;
42 itg[k][ 0 ] ++ ;
43 }
44 if (itg[k][ 0 ] >= 61 ) flg = 0 ;
45 for (M = 0 ; M <= tmp[ 0 ]; M ++ ) {
46 rev[M] = tmp[M];
47 }
48 }
49
50 int main()
51 {
52 int i, j, K, M;
53 flg = 1 ;
54 i = 2 ;
55 // freopen("out.txt", "w", stdout);
56 memset(itg, 0 , sizeof (itg));
57 itg[ 1 ][ 0 ] = itg[ 1 ][ 1 ] = 1 ;
58 printf( " 1\n " );
59 while (flg) {
60 rev[ 0 ] = rev[ 1 ] = 1 ;
61 for (j = 2 ; j <= i - 1 ; j ++ ) {
62 add(j);
63 }
64 itg[i][ 0 ] = itg[i][ 1 ] = 1 ;
65 for (K = 1 ; K <= i; K ++ ) {
66 if (K > 1 ) putchar( ' ' );
67 for (M = itg[K][ 0 ]; M >= 1 ; M -- ) {
68 printf( " %d " , itg[K][M]);
69 }
70 }
71 puts( "" );
72 i ++ ;
73 }
74 return 0 ;
75 }

 

你可能感兴趣的:(pascal)