http://acm.timus.ru/problem.aspx?space=1&num=1048
题目翻译
新的编程语言D++的开发者们希望设计一个SuperLongInt类型,因为有时候程序员需要计算超大的数,甚至1000位的数字也算小。你需要计算2个位数不超过1,000,000位的数字的和。
输入
第一行一个整数 N(1≤N≤1,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;
}