Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตรวจสอบเลขใหญ่หาร 12 ลงตัวใน C++

บทนำ

การตรวจสอบเลขใหญ่ (ในรูปสตริง) หาร 12 ลงตัว ใช้หลักการ: หาร 12 ลงตัว ⇔ หาร 3 ลงตัว และ หาร 4 ลงตัว

กฎการหาร

  • หาร 3 ลงตัว: ผลรวมหลักหาร 3 ลงตัว
  • หาร 4 ลงตัว: เลขสองหลักท้ายหาร 4 ลงตัว

ขั้นตอนการแก้ปัญหา

  1. ถ้าความยาว ≥ 3: ตรวจสอบหลักสุดท้ายเป็นเลขคู่ (หาร 2 ลงตัว) → ต้องเป็นจริงเพื่อหาร 4 ลงตัวได้
  2. คำนวณผลรวมทุกหลัก → ตรวจสอบหาร 3 ลงตัว
  3. นำเลขสองหลักท้าย → ตรวจสอบหาร 4 ลงตัว
  4. ถ้าทั้งสองเงื่อนไขจริง → หาร 12 ลงตัว
  5. ถ้าความยาว < 3: แปลงเป็น int ตรงๆ แล้วเช็ค modulo 12

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

bool isNumberDivisibleBy12(string num) {
    if (num.length() >= 3) {
        int last_digit = (int)num[num.length() - 1] - '0';
        if (last_digit % 2 != 0) {
            return 0;
        }
        int second_last_digit = (int)num[num.length() - 2] - '0';
        int sum = 0;
        for (int i = 0; i < num.length(); i++) {
            sum += num[i] - '0';
        }
        return (sum % 3 == 0 && (second_last_digit * 10 + last_digit) % 4 == 0);
    } else {
        int number_as_int = stoi(num);
        return number_as_int % 12 == 0;
    }
}

int main() {
    string num = "1212121212121212121212121212";
    if (isNumberDivisibleBy12(num)) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}

ผลลัพธ์

Yes

หมายเหตุแก้ไขบั๊ก

โค้ดต้นฉบับมีบั๊ก: `int last_digit = (int)num[num.length() - 1];` จะได้ค่า ASCII code ไม่ใช่ตัวเลข ต้องลบ `'0'` เพื่อได้ค่าจริง

สรุป

ใช้กฎการหาร 3 และ 4 ร่วมกัน ตรวจสอบเลขใหญ่ได้ใน O(n) โดยไม่ต้องแปลงเป็นตัวเลขใหญ่