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

C++로 아담 수(Adam Number) 판별하기: 개념부터 예제 코드까지

아담 수(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 등도 아담 수에 해당합니다.

아담 수 판별 알고리즘

주어진 수가 아담 수인지 확인하는 절차는 다음과 같습니다.

  1. 주어진 수 xy의 제곱 (xy)2를 구합니다.
  2. xy의 자릿수를 뒤집아 yx를 만듭니다.
  3. yx의 제곱 (yx)2를 구합니다.
  4. (xy)2의 자릿수를 뒤집아 (yx)2와 비교합니다.
  5. 두 값이 서로 같다면 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은 아담 수임을 확인할 수 있습니다.