1. 程式人生 > >上海交大OJ 高精度整數

上海交大OJ 高精度整數

1014. 高精度加法

Description

輸入2個整數a和b,輸出a+b。

Input Format

輸入有兩行,第一行a,第二行b。

0≤a,b≤10 100000  0≤a,b≤10100000 。

Output Format

輸出只有一行,a+b。

Sample Input

1234
1111111111

Sample Output

1111112345
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

int main(int argc, char const *argv[]) {
    string a,b;
    cin >> a >> b;

    //sa - a轉化成的陣列  sb - b轉化成的陣列
    char sa[1000005];
    char sb[1000005];

    //進行字串 - 字元陣列轉化
    strcpy(sa,a.c_str());
    strcpy(sb,b.c_str());

    //用於儲存計算結果
    vector<int> u;

    //標誌是否進位
    int t = 0;
    //當上面的數筆下面的數長時
    if(a.length() > b.length()){
        for(int i = a.length(),j = b.length();i > 0;i--,j--){
            //當此位有兩個數時
            if(j > 0){
                //當不進位的時候
                if((sa[i - 1] - '0') + (sb[j - 1] - '0') + t < 10){
                    //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t);
                    //同位相加入棧
                    u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t);
                    t = 0;
                }else{//當進位時
                    //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10);
                    u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t - 10);
                    t = 1;
                }
            }else{//當此位只剩一個數時
                //當不進位的時候
                if((sa[i - 1] - '0') + t < 10){
                    //同位相加入棧
                    u.push_back((sa[i - 1] - '0') + t);
                    t = 0;
                }else{//當進位時
                    //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10);
                    u.push_back((sa[i - 1] - '0') + t - 10);
                    t = 1;
                }
            }
        }
        if(t > 0)u.push_back(t);
    }
    else{//當下面數比上面長時
        for(int i = a.length(),j = b.length();j > 0;i--,j--){
            if(i > 0){
                if((sa[i - 1] - '0') + (sb[j - 1] - '0') + t < 10){
                    //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t);
                    u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t);
                    t = 0;
                }else{
                    //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10);
                    u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t - 10);
                    t = 1;
                }
            }else{
                if((sb[j - 1] - '0') + t < 10){
                    //同位相加入棧
                    u.push_back((sb[j - 1] - '0') + t);
                    t = 0;
                }else{//當進位時
                    //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10);
                    u.push_back((sb[j - 1] - '0') + t - 10);
                    t = 1;
                }
            }
        }
        if(t > 0)u.push_back(t);
    }
    //出棧輸出結果
    while (!u.empty()) {

        printf("%d",u.back());

        u.pop_back();
    }

    return 0;
}