1. 程式人生 > >[Nowcoder] 大整數相乘(拼多多筆試題)

[Nowcoder] 大整數相乘(拼多多筆試題)

pac push_back coder 大數 str1 位數 問題 str 例子

有兩個用字符串表示的非常大的大整數,算出他們的乘積,也是用字符串表示。不能用系統自帶的大整數類型。

輸入描述:
空格分隔的兩個字符串,代表輸入的兩個大整數
輸出描述:
輸入的乘積,用字符串表示
輸入例子1:
72106547548473106236 982161082972751393
輸出例子1:
70820244829634538040848656466105986748


大數乘法問題

簡單來說就是把A[i]*B[j]累加放到臨時數組的C[i+j]位置。

然後對數組C執行進位加法即可。

剩下的步驟就是字符與數字之間的轉換與逆序問題。

參考代碼如下:

#include <iostream>
#include 
<string> #include <vector> using namespace std; int main() { string str1, str2; while (cin >> str1 >> str2) { int n1 = str1.size(), n2 = str2.size(); vector<int> v1, v2; // 將兩個字符串放入數組中並逆序 for (int i = n1 - 1; i >= 0; --i) { v1.push_back(str1[i]
- 0); } for (int i = n2 - 1; i >= 0; --i) { v2.push_back(str2[i] - 0); } // 待處理的臨時數組 vector<int> v(n1 + n2, 0); for (int i = 0; i < n1; ++i) { for (int j = 0; j < n2; ++j) { v[i
+ j] += v1[i] * v2[j]; } } // 處理數組中的加法進位 for (int i = 0; i < n1 + n2-1; ++i) { v[i + 1] += (v[i] / 10); v[i] = v[i] % 10; } string res; // 判斷最終結果的有效位數 int m = n1 + n2 - 1; if (v[n1 + n2 - 1] == 0) m = n1 + n2 - 2; // 將結果轉換為字符串 for (int i = m; i >= 0; --i) { res += (v[i] + 0); } cout << res << endl; } return 0; }

[Nowcoder] 大整數相乘(拼多多筆試題)