Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Kiểm tra số lớn chia hết cho 12 trong C++

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
3Tổng các chữ số chia hết cho 3
4Số tạo bởi 2 chữ số cuối chia hết cho 4
12Thỏ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.