POJ 2602|URAL 1048|Superlong Sums|高精度加法

30 篇文章 0 订阅
3 篇文章 0 订阅

http://acm.timus.ru/problem.aspx?space=1&num=1048

题目翻译

新的编程语言D++的开发者们希望设计一个SuperLongInt类型,因为有时候程序员需要计算超大的数,甚至1000位的数字也算小。你需要计算2个位数不超过1,000,000位的数字的和。

输入

第一行一个整数 N(1N1,000,000) ,表示输入的2个数字的位数,接下来N行每行2个数,两个数的和的位数不会超过N,可能有前导零。

输出

输出一行N位数表示和。

样例输入

4
0 4
4 2
6 8
3 7

样例输出

4750

题解

我良心发现决定写高精度加法的题解。。
首先我们知道C语言自带的数据类型char, short int, int, long int, long long int都是限定了范围。最好的long long int的范围也是 [263,263) ,超出了这个范围的数字加法怎么实现呢?就是模拟我们平常手算的方式,两个数字的最低位对齐,然后从右向左一位一位对应着加,该进位就进位,没有什么特别的。比如

 12345
+23456
------
 35801
下标:
012345

但是首先要将两个字符串右对齐才能加法,然后进位是向前(向左)进位的,也就是说如果两个5位的数字做了加法后的结果是6位的,那么进位就没地方放了,当然可以将输入的字符串设置为从下标1开始,这样进位就可以进位到下标为0的数组元素。不过这些都不太方便。最方便的做法就是反转整个字符串,然后加法,进位向右进位,比如:

54321
65432
-----
10853

这样进位向右进位就没有那么多事情啦,而且字符串一开始就是左对齐的,一举两得~(实际上如果学习了高精度乘法后就知道位数暴增什么的不知道该预留多少位给进位),最后再翻转回来就可以了。

不过本题的输入比较特别,直接从最低位开始给,所以最开始的翻转就不需要了,但是最后对答案的翻转还是要有的。

// POJ 2602, URAL 1048
#include <cstdio>
#define N 1000005
int a[N], b[N], c[N];
int main() {
    int i, n;
    scanf("%d", &n);
    for (i = n; i > 0; --i)
        scanf("%d%d", &a[i], &b[i]);

    for(i = 1; i <= n; ++i) {
        c[i] += a[i] + b[i];
        c[i + 1] = c[i] / 10;
        c[i] %= 10;
    }
    for (i = n; i > 0; --i)
        printf("%d", c[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值