아담 수(Adam Number)란?
아담 수(Adam Number)는 어떤 수의 제곱이, 그 수를 거꾸로 뒤집은 수의 제곱을 다시 한 번 뒤집은 값과 정확히 일치하는 수를 말합니다.
조금 더 쉽게 표현하면, 수 N에 대해 다음 두 값이 같을 때 N을 아담 수라고 부릅니다.
- N의 제곱
- N을 뒤집은 수의 제곱을 다시 뒤집은 값
예시로 이해하기
숫자 12를 예로 들어 보겠습니다.
- 12의 제곱은 144입니다.
- 12의 자릿수를 뒤집으면 21이 됩니다.
- 21의 제곱은 441입니다.
- 441은 144(=12의 제곱)를 뒤집은 값과 같습니다.
두 값이 일치하므로 12는 아담 수입니다. 같은 방식으로 13, 31, 102, 103, 112, 113 등도 아담 수에 해당합니다.
아담 수 판별 알고리즘
주어진 수가 아담 수인지 확인하는 절차는 다음과 같습니다.
- 주어진 수 xy의 제곱 (xy)2를 구합니다.
- xy의 자릿수를 뒤집아 yx를 만듭니다.
- yx의 제곱 (yx)2를 구합니다.
- (xy)2의 자릿수를 뒤집아 (yx)2와 비교합니다.
- 두 값이 서로 같다면 xy는 아담 수입니다.
C++ 구현 예제
아래 코드는 자릿수를 뒤집는 함수와 아담 수 판별 로직으로 구성되어 있습니다.
#include <iostream>
using namespace std;
// 숫자의 자릿수를 뒤집는 함수
int reverseDigits(int num) {
int rev = 0;
while (num > 0) {
rev = rev * 10 + num % 10; // 마지막 자릿수를 결과에 추가
num /= 10; // 마지막 자릿수 제거
}
return rev;
}
int main() {
int num = 31;
cout << num << " is ";
int rev = reverseDigits(num);
// 원래 수의 제곱과 '뒤집은 수의 제곱을 다시 뒤집은 값'을 비교
if ((num * num) == reverseDigits(rev * rev))
cout << "Adam Number";
else
cout << "not an Adam Number";
return 0;
}
코드 동작 원리
- reverseDigits(): 나머지 연산자(
%)로 마지막 자릿수를 하나씩 추출하고, 10으로 나누어 자릿수를 줄여가며 뒤집힌 수를 완성합니다. - main(): 입력 수를 먼저 뒤집은 뒤, (원래 수의 제곱)과 (뒤집은 수의 제곱을 다시 뒤집은 값)이 같은지 비교하여 아담 수 여부를 출력합니다.
실행 결과
31 is Adam Number
31을 뒤집으면 13이고, 31² = 961, 13² = 169이며, 169를 다시 뒤집으면 961이 됩니다. 따라서 31은 아담 수임을 확인할 수 있습니다.