1. 程式人生 > 其它 >C++題解 高精度加法

C++題解 高精度加法

C++題解 高精度加法

題目分析

給定兩個正整數(不含前導 0),計算它們的和。

輸入格式

共兩行,每行包含一個整數。

輸出格式

共一行,包含所求的和。

資料範圍

1≤整數長度≤100000

輸入樣例:

12
23

輸出樣例:

35

思路

對於該題目的實現,我們使用兩個陣列進行加法的模擬,為了方便此處使用vector。

資料的輸入

可以看到數字的長度遠遠超過了long long的需要,我們需要使用字串進行資料的讀入。

注意,為了運算方便,應該從字串的末尾將原數字倒序的進行讀入,想一想為什麼。

模擬加法

在這裡,我們使用一個整型變數 r 進行運算的儲存。將數字 a b 的相應位相加後,我們通過儲存 r % 10

作為該位的最終結果,隨後 r /= 10 ,將它作為下一位運算中現在位的進位。

最後,最高位相加完成後,判斷最高位是否存在進位,若真則進行相應處理。

資料的輸出

按照人類的習慣,我們將陣列從最高位開始輸出即可。

以下是程式碼實現


//
// Created by Owwkmidream on 2021/10/30.
//
#include "iostream"
#include "vector"
using namespace std;

vector<int> add(vector<int>& A, vector<int>& B)
{
    vector<int> C;
    if(A.size() < B.size()) return add(B, A);

    int r = 0;
    for (int i = 0; i < A.size(); ++i) {
        r += A[i];
        if(i < B.size())    r += B[i];
        C.push_back(r % 10);
        r /= 10;
    }
    if(r)   C.push_back(r);

    return C;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    vector<int> A, B; string a, b;
    
    cin >> a >> b;

    for (int i = a.size() - 1; i >= 0 ; --i) A.push_back(a[i] - '0');
    for (int i = b.size() - 1; i >= 0 ; --i) B.push_back(b[i] - '0');

    auto C = add(A, B);

    for (int i = C.size() - 1; i >= 0 ; --i) 
        cout << C[i];

    return 0;
}