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 100!100! 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ớ:

Cộng số lớn theo cột. Cộng từ phải sang trái từng cột; nếu tổng một cột ≥ 10 thì viết phần đơn vị, nhớ 1 sang cột kế tiếp — đúng như cách cộng tay. Ở đây 387+956=1343387 + 956 = 1343.

Ý 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):

cong-so-lon.cpp
// 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ư 387+956387+956 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.