Giới thiệu
Kiểm tra số lớn (dưới dạng chuỗi) có chia hết cho 12 hay không. Sử dụng tính chất: số chia hết cho 12 ⇔ chia hết cho 3 VÀ chia hết cho 4.
Quy tắc chia hết
| Số | Quy tắc |
|---|---|
| 3 | Tổng các chữ số chia hết cho 3 |
| 4 | Số tạo bởi 2 chữ số cuối chia hết cho 4 |
| 12 | Thỏa mãn cả hai quy tắc trên |
Mã nguồn hoàn chỉnh
#include <bits/stdc++.h>
using namespace std;
bool isNumberDivisibleBy12(string num) {
int len = num.length();
if (len >= 3) {
// Kiểm tra chia hết cho 4: 2 chữ số cuối
int last_digit = num[len - 1] - '0';
int second_last_digit = num[len - 2] - '0';
int last_two_digits = second_last_digit * 10 + last_digit;
if (last_two_digits % 4 != 0) {
return false;
}
// Kiểm tra chia hết cho 3: tổng chữ số
int sum = 0;
for (int i = 0; i < len; i++) {
sum += num[i] - '0';
}
return (sum % 3 == 0);
} else {
// Số nhỏ, chuyển về int và kiểm tra trực tiếp
int number = stoi(num);
return number % 12 == 0;
}
}
int main() {
string num = "1212121212121212121212121212";
if (isNumberDivisibleBy12(num)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
Kết quả chạy chương trình
Yes
Phân tích độ phức tạp
- Thời gian: O(n) - duyệt chuỗi một lần để tính tổng chữ số
- Không gian: O(1) - chỉ dùng biến đếm
Lưu ý quan trọng
Code gốc có lỗi: int last_digit = (int)num[num.length() - 1]; lấy mã ASCII thay vì giá trị số. Đã sửa thành num[i] - '0'.
Kiểm tra thêm
int main() {
vector<string> test_cases = {
"12", "24", "36", "48", "60", "72", "84", "96", // Chia hết 12
"13", "25", "37", "100", "123456789" // Không chia hết
};
for (string s : test_cases) {
cout << s << ": " << (isNumberDivisibleBy12(s) ? "Yes" : "No") << endl;
}
return 0;
}
Kết luận
Kết hợp quy tắc chia hết cho 3 và 4 cho phép kiểm tra chia hết cho 12 hiệu quả trên số lớn mà không cần chuyển đổi kiểu dữ liệu.