高精度加法
题目描述
输入两个正整数(最多100000 位),输出它们的和。
输入
两行,两个整数。
输出
一行,一个整数
样例输入
999999999999999999999999999999999999999999999999999999
12345678999999999999999999999999
样例输出
1000000000000000000000012345678999999999999999999999998
看这个数据范围,就是需要高精度加法。
模拟电脑做竖式加法
首先我们用数组存这两个数。为了方便读入,我们采用字符串读入,然后将其转化成数字存进数组中。存进数组的时候要倒着存入,为什么呢?这样的话就能保证两个数的每一位都对齐了,为接下来的模拟列竖式提供了很大的便利。
模拟列竖式其实也不必多说,写法也不少。其实关键在于进位的问题,先进位,在把这一位的两数相加。
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #define N 100005 using namespace std; char a1[N]= {0},b1[N]= {0}; int a[N]= {0},b[N]= {0},c[N]= {0}; int a1len,b1len,lenc,x; int main() { freopen("bigadd.in","r",stdin); freopen("bigadd.out","w",stdout); char a1[N],b1[N]; int a[N]= {0},b[N]= {0},c[N]= {0}; int a1len,b1len,lenc,x,i; gets(a1); gets(b1); a1len=strlen(a1); b1len=strlen(b1); for( i=0; i<=a1len; ++i) { a[a1len-i]=a1[i]-48; } for( i=0; i<=b1len; ++i) { b[b1len-i]=b1[i]-48; } lenc=1; x=0; while(lenc<=a1len||lenc<=b1len) { c[lenc]=a[lenc]+b[lenc]+x; x=c[lenc]/10; c[lenc]=c[lenc]%10; lenc++; } c[lenc]=x; if(c[lenc]==0) { lenc--; } for( i=lenc; i>=1; i--) cout << c[i]; cout << endl; return 0; }