给出2个大整数A,B,计算A+B的结果。

Input

第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)

Output

输出A + B

Input示例

68932147586
468711654886

Output示例

537643802472

 

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;

const int N = 10100;

char a[N], b[N];
int x[N], w[N];
int alen, blen;
int xlen, wlen;
bool xf, wf;
// xf = 0 数A为正数,反之为负数; wf 同理

void Standard();
// 将 a[] 去掉符号位存入 x[]
// 将 b[] 去掉符号位存入 w[]
void Add(); // 两个数相加
void Sub(); // 两个数相减
int Max();
// 比较正数A, B 谁更大 , A大返回1 ,B大返回2, 相等返回0

int main()
{
    cin >> a >> b;
    alen = strlen(a), blen = strlen(b);
    memset(w, 0, sizeof(w));
    memset(x, 0, sizeof(x));
    Standard(); 

    if(!xf && !wf) {
        Add();
    }
    else if(xf && wf) {
        cout << "-";
        Add();
    }
    else {
        int res = Max();
        if(res == 0){
            cout << "0";
        }
        else if((xf && res == 1) || (wf && res == 2)) {
            cout << '-';
            Sub();
        }
        else {
            Sub();
        }
    }
    return 0;
}

int Max() {
    if(xlen > wlen) {
        return 1;
    }
    if(xlen < wlen) {
        return 2;
    }
    for(int i=xlen-1; i>=0; i--) {
        if(x[i] > w[i])
            return 1;
        if(w[i] > x[i])
            return 2;
    }
    return 0;
}

void Sub() {
    if(Max() == 1) {
        for(int i=0; i<xlen; i++) {
            x[i] = x[i]-w[i];
            if(x[i] < 0) {
                x[i] += 10;
                -- x[i+1];
            }
        }
        int temp = xlen;
        while(x[temp]==0){
            temp--;
        }
        for(int i=temp; i>=0; i--) {
            cout << x[i];
        }
    }
    else {
        for(int i=0; i<wlen; i++) {
            w[i] = w[i]-x[i];
            if(w[i] < 0) {
                w[i] += 10;
                -- w[i+1];
            }
        }
        int temp = wlen;
        while(w[temp]==0){
            temp--;
        }
        for(int i=temp; i>=0; i--) {
            cout << w[i];
        }
    }
}

void Add() {
    if(xlen >= wlen) {
        for(int i=0; i<xlen; i++) {
            x[i] += w[i];
            if(x[i] >= 10) {
                x[i] %= 10;
                x[i+1] ++;
            }
        }
        if(x[xlen] > 0)
            cout << x[xlen];
        for(int i=xlen-1; i>=0; i--) {
            cout << x[i];
        }
    }
    else {
        for(int i=0; i<wlen; i++) {
            w[i] += x[i];
            if(w[i] >= 10) {
                w[i] %= 10;
                ++ w[i+1];
            }
        }
        if(w[wlen] > 0)
            cout << w[wlen];

            for(int i=wlen-1; i>=0; i--) {
                cout << w[i];
            }
    }
}

void Standard() {
    int t = alen;
    if(isdigit(a[0])) {
        xlen = alen;
        xf = 0;
        for(int i=0; i<alen; i++) {
            x[i] = a[--t] - '0';
        }
    }
    else {
        xf = 1;
        xlen = alen-1;
        for(int i=0; i<xlen; i++) {
            x[i] = a[--t] - '0';
        }
    }
   t = blen;
   if(isdigit(b[0])) {
        wf = 0;
        wlen = blen;
        for(int i=0; i<blen; i++) {
            w[i] = b[--t] - '0';
        }
   }
   else {
         wf = 1;
         wlen = blen-1;
         for(int i=0; i<wlen; i++) {
            w[i] = b[--t] - '0';
         }
   }
}