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

C++題解 高精度乘法

C++題解 高精度乘法

題目描述

給定兩個非負整數(不含前導 0) A 和 B,請你計算 A×B 的值。

輸入格式

共兩行,第一行包含整數 A,第二行包含整數 B。

輸出格式

共一行,包含 A×B 的值。

資料範圍

$$
1≤A的長度≤100000,\
0≤B≤10000
$$

輸入樣例:

2
3

輸出樣例:

6

思路

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

資料的輸入

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

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

模擬加法

在這裡,我們使用一個整型變數 r

進行運算的儲存。將數字 a b 的相應位相乘後,我們通過儲存 r % 10 作為該位的最終結果,隨後 r /= 10 ,將它作為下一位運算中。

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

資料的輸出

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

前導0處理

這裡有一個比較特殊的情況,12345 * 0如果我們得到了 00000 ,那麼我們輸出的時候就會導致我們出錯。這裡我們做了處理,迴圈檢測高位數字,有0則去除,直到高位數字不為0。

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

vector<int> multi(vector<int>& A, int b)
{
    vector<int> C;
    
    if(!b)  {
        C.push_back(0); 
        return C;
    }

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

    return C;
}

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

    string a; int b;
    cin >> a >> b;

    vector<int> A;

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

    auto C = multi(A, b);

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

    return 0;
}