C++題解 高精度乘法
阿新 • • 發佈:2021-10-31
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; }