Toán & số học
6. Xử lý số lớn (big number)
Khi số vượt quá cả long long (hơn 18 chữ số) — ví dụ tính hay cộng hai số 200 chữ số — ta lưu mỗi chữ số trong một ô mảng và làm phép tính như đặt tính tay. Hình minh hoạ phép cộng theo cột, có nhớ:
Ý tưởng cài đặt: đảo ngược hai số để chữ số hàng đơn vị nằm ở chỉ số 0, cộng từng cột kèm biến nho (carry):
// a, b la hai so luu duoi dang xau, da dao nguoc (don vi o index 0)
int na = a.size(), nb = b.size();
string kq = "";
int nho = 0;
for (int i = 0; i < max(na, nb) || nho; i++) {
int s = nho;
if (i < na) s += a[i] - '0'; // chu so cua a tai cot i
if (i < nb) s += b[i] - '0'; // chu so cua b tai cot i
kq += char(s % 10 + '0'); // viet chu so don vi
nho = s / 10; // phan nho sang cot sau
}
// dao nguoc kq lai de in ra
a[i] - '0' đổi ký tự chữ số (như '7') thành số 7; ngược lại s % 10 + '0' rồi ép char để biến số thành ký tự.Đừng quên phần nhớ cuối cùng
Điều kiện vòng lặp ... || nho đảm bảo: nếu cộng xong cột cuối mà vẫn còn nhớ (như tràn lên hàng nghìn), ta viết nốt chữ số nhớ đó. Bỏ sót bước này là lỗi rất hay gặp.