Hướng giải của NHÂN HAI SỐ LỚN(HSG THCS PHÚ YÊN)
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Tổng quan
Vì kết quả của phép toán tối đa vào khoảng \(10^{10} * 10^{120} = 10^{1200}\), tốt nhất ta nên biểu diễn các số được nhập vào trong bài này dưới dạng xâu kí tự.
Ta thực hiện phép nhân hai số lớn theo các nguyên tắc của nhân hai số tự nhiên đã học ở bậc Tiểu học.
Các bước thực hiện:
- Chuyển \(S_1\) và \(S_2\) được nhập vào từ xâu thành mảng.
- Khởi tạo mảng kết quả \(ans\) chỉ toàn các số 0.
- Duyệt từ phải qua trái: với mỗi chữ số của \(S_2\), ta nhân với chữ số hàng đơn vị tương ứng ở \(S_1\), được bao nhiêu thì thêm kết quả vào \(ans\).
- In ra mảng \(ans\) theo thứ tự từ cuối lên là kết quả của phép toán. Chú ý không in ra các số \(0\) ở đầu.
Ngoài ra, ngôn ngữ Python mặc định có khả năng xử lý các số rất lớn. Vậy nên ta chỉ cần thực hiện phép nhân \({S_1} * {S_2}\) bằng toán tử nhân có sẵn.
Lời giải (C++)
#include <bits/stdc++.h>
using namespace std;
string s1, s2;
vector<int> x, y, ans;
int main(){
cin.tie(0) -> sync_with_stdio(0); cout.tie(0);
cin >> s1 >> s2;
int m = s1.size(), n = s2.size();
x.assign (m, 0);
for (int i = 0; i < m; i++) x[i] = s1[m - i - 1] - '0';
y.assign (n, 0);
for (int i = 0; i < n; i++) y[i] = s2[n - i - 1] - '0';
ans.assign (m + n, 0);
for (int i = 0; i < n; i++) {
int nho = 0;
for (int j = 0; j < m; j++) {
int t = x[j] * y[i] + nho + ans[i + j];
nho = t / 10;
ans[i + j] = t % 10;
}
ans[i + m] = nho;
}
while (ans.size() && !ans.back()) ans.pop_back();
reverse (begin(ans), end(ans));
for (int i : ans) cout << i;
}
Lời giải (Python)
print (int(input()) * int(input()))
Chú ý: Input trong bài này mặc định là 2 dòng tương ứng 2 số \(S_1\) và \(S_2\). Nếu input có cả 2 số cùng ở trên 1 dòng, ta cần dùng input().split()
.
s1, s2 = map (int, input().split())
print (s1 * s2)
Không có ý kiến tại thời điểm này.