高精度加法

问题描述
  输入两个整数 ab,输出这两个整数的和。 ab都不超过100位。
算法描述
  由于 ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组 AA[0]用于存储 a的个位, A[1]用于存储 a的十位,依此类推。同样可以用一个数组 B来存储 b
  计算 c =  a +  b的时候,首先将 A[0]与 B[0]相加,如果有进位产生,则把进位(即和的十位数)存入 r,把和的个位数存入 C[0],即 C[0]等于( A[0]+ B[0])%10。然后计算 A[1]与 B[1]相加,这时还应将低位进上来的值 r也加起来,即 C[1]应该是 A[1]、 B[1]和 r三个数的和.如果又有进位产生,则仍可将新的进位存入到 r中,和的个位存到 C[1]中。依此类推,即可求出 C的所有位。
  最后将 C输出即可。
输入格式
  输入包括两行,第一行为一个非负整数 a,第二行为一个非负整数 b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
  输出一行,表示 b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出

20100122203011233454668012


源代码
1
#include<stdio.h>
2
#include<string.h>
3
#define MAXa 100
4
#define MAXb 100
5
#define MAXc 101
6
int main()
7
{
8
  char a[MAXa];
9
  char b[MAXb];
10
  int c[MAXc];
11
  int la, lb;
12
  int i, j;
13
  int r = 0;
14
  int n = 0;
15
  int s;//计算某一位未进位之前的值
16
17
  scanf("%s%s", a, b);
18
  memset(c,0,sizeof(c));
19
  la = strlen(a);
20
  lb = strlen(b);
21
22
  for (i = la - 1, j = lb - 1; i >= 0 && j >= 0; i--, j--)
23
  {
24
    s = (a[i] - '0') + (b[j] - '0') + r;
25
    c[n++] = s % 10;
26
    r = s / 10;
27
  }
28
  if (la > lb )
29
  {
30
    for (; i >= 0; i--)
31
    {
32
      s = a[i] - '0' + r;
33
      c[n++] = s % 10;
34
      r = s / 10;
35
    }
36
  }
37
  else if ((la < lb) && (j >= 0))
38
  {
39
    for (; j >= 0; j--)
40
    {
41
      s = b[j] - '0' + r;
42
      c[n++] = s % 10;
43
      r = s / 10;
44
    }
45
  }
46
  else
47
  {
48
    c[n++] = r;
49
  }
50
  for (i = MAXc - 1; i >= 0; i--)
51
  {
52
    if (c[i])
53
    {
54
      break;
55
    }
56
  }
57
  for (j = i; j >= 0; j--)
58
  {
59
    printf("%d", c[j]);
60
  }
61
  printf("\n");
62
63
  return 0;
64
}
详细记录
评测点序号 评测结果 得分 CPU使用 内存使用 下载评测数据
1 正确 10.00 0ms 836.0KB 输入 输出
2 正确 10.00 0ms 840.0KB 输入 输出
3 正确 10.00 0ms 840.0KB 输入 输出
4 正确 10.00 0ms 836.0KB 输入 输出
5 正确 10.00 0ms 836.0KB 输入 输出
6 正确 10.00 0ms 836.0KB 输入 输出
7 正确 10.00 0ms 836.0KB 输入 输出
8 正确 10.00 0ms 836.0KB 输入 输出
9 正确 10.00 0ms 836.0KB 输入 输出
10 正确 10.00 0ms 836.0KB 输入 输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值