이 튜토리얼에서는 문자열 형태로 주어진 매우 큰 숫자가 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의 배수인지 판별하는 방법을 알아보았습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨 주세요.