Số lớn lưu dưới dạng string. Kiểm tra chia hết cho 13 bằng 2 quy tắc:
- Tổng xen kẽ khối 3 chữ số: Tách thành nhóm 3 chữ số từ phải, cộng/trừ xen kẽ. Nếu kết quả chia hết 13 → số gốc chia hết 13. VD: 2911285 → 2 - 911 + 285 = -624 (chia hết 13)
- Quy tắc chữ số cuối: Cắt chữ số cuối, nhân 4 cộng vào phần còn lại. Lặp lại. VD: 2353 → 235+3×4=247 → 24+7×4=52 (chia hết 13)
Ví dụ minh họa (Quy tắc 1)
#include <bits/stdc++.h>
using namespace std;
bool isDiv13(string num) {
int len = num.size();
if (len == 1 && num[0] == '0') return true;
// Can bang do dai thanh boi cua 3
if (len % 3 == 1) { num += "00"; len += 2; }
else if (len % 3 == 2) { num += "0"; len += 1; }
int sum = 0, sign = 1;
for (int i = len - 1; i >= 0; i -= 3) {
int group = (num[i] - '0') + (num[i-1] - '0')*10 + (num[i-2] - '0')*100;
sum += sign * group;
sign *= -1;
}
return (abs(sum) % 13 == 0);
}
int main() {
string num = "83959092724";
cout << (isDiv13(num) ? "Chia het" : "Khong chia het");
}
Kết quả
Chia het