高精度加法
题目描述
输入两个正整数(最多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;
}

 

posted on 2018-03-07 20:28  DERZHAO  阅读(307)  评论(0编辑  收藏  举报