Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 문자열 형태의 큰 숫자가 12의 배수인지 판별하는 방법


이 튜토리얼에서는 문자열 형태로 주어진 매우 큰 숫자가 12로 나누어 떨어지는지 확인하는 C++ 프로그램을 작성해 보겠습니다.

이 문제는 약간의 수학적 성질을 활용하면 손쉽게 해결할 수 있습니다. 어떤 수가 3으로도 나누어 떨어지고 4로도 나누어 떨어진다면, 그 수는 반드시 12로 나누어 떨어집니다.

각 자리 숫자의 합이 3으로 나누어 떨어지면 그 수는 3의 배수입니다.

마지막 두 자리 숫자가 4로 나누어 떨어지면 그 수는 4의 배수입니다.

이제 위의 성질들을 활용해 프로그램을 완성해 보겠습니다.

예제 코드

그럼 전체 코드를 살펴보겠습니다.

#include <bits/stdc++.h>
using namespace std;
bool isNumberDivisibleBy12(string num) {
    if (num.length() >= 3) {
        int last_digit = (int)num[num.length() - 1];
        if (last_digit % 2 != 0) {
            return 0;
        }
        int second_last_digit = (int)num[num.length() - 2];
        int sum = 0;
        for (int i = 0; i < num.length(); i++) {
            sum += num[i];
        }
        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

코드 설명

숫자가 문자열로 아주 길게 주어졌기 때문에 일반적인 정수형 변수에는 담을 수 없습니다. 따라서 프로그램은 입력 길이에 따라 다음과 같이 동작합니다.

  • 길이가 3 이상인 경우: 먼저 마지막 자리 숫자가 홀수이면 4의 배수일 수 없으므로 즉시 거짓을 반환합니다. 이후 각 자리 값의 합이 3으로 나누어 떨어지는지, 그리고 마지막 두 자리로 만든 수가 4로 나누어 떨어지는지 검사합니다.
  • 길이가 3 미만인 경우: 숫자가 충분히 작으므로 stoi()로 정수로 변환한 뒤 12로 나누어 직접 확인합니다.

참고로 이 코드는 각 자리 문자를 정수로 따로 변환하지 않고 문자 코드 값을 그대로 사용합니다. 숫자 문자의 아스키 코드 오프셋(48)이 2와 3의 배수이고, 두 자리 계산 시 추가되는 값(528)이 4의 배수이기 때문에 나머지 연산 결과에는 영향을 주지 않습니다.

마무리

이상으로 문자열 형태의 큰 숫자가 12의 배수인지 판별하는 방법을 알아보았습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨 주세요.