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 }

 

posted @ 2010-05-18 09:19  superbin  阅读(564)  评论(0编辑  收藏  举报