UVa 485 Pascal's Triangle of Death

本文介绍了一种使用数组实现大整数加法的方法,并通过杨辉三角的生成来展示这一算法的应用。着重讨论了不同数位相加时的处理方式及进位问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

ContractedBlock.gifExpandedBlockStart.gifcode
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 }

 

转载于:https://www.cnblogs.com/superbin/archive/2010/05/18/1737910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值