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

C++ 예제로 배우는 디세리움(Deserium) 수 판별 방법

이 튜토리얼에서는 디세리움(Deserium) 수가 무엇인지 살펴보고, C++ 코드 예제와 함께 주어진 숫자가 디세리움 수인지 판별하는 방법을 알아보겠습니다.

디세리움 수란?

각 자릿수를 거듭제곱한 값들의 합이 원래 수와 같은 숫자를 디세리움 수라고 합니다. 여기서 중요한 점은 가장 높은 자릿수부터 1의 자릿수까지 거듭제곱 지수가 하나씩 감소한다는 것입니다.

예를 들어 135를 살펴보겠습니다.

  • 자릿수 개수는 3개입니다.
  • 계산 과정: 11 + 32 + 53 = 1 + 9 + 125 = 135

거듭제곱의 합이 원래 수인 135와 같으므로, 135는 디세리움 수입니다.

판별 알고리즘 단계

주어진 숫자가 디세리움 수인지 확인하는 절차는 다음과 같습니다.

  • 숫자를 초기화합니다.
  • 해당 숫자의 자릿수 개수를 구합니다.
  • 합계를 저장할 변수를 0으로 초기화합니다.
  • 숫자가 0이 될 때까지 반복합니다.
    • 10으로 나눈 나머지를 이용해 마지막 자릿수를 추출합니다.
    • pow(자릿값, 남은 자릿수)를 합계에 더합니다.
    • 자릿수 카운트를 하나 감소시키고, 숫자를 10으로 나눕니다.
  • 반복이 끝난 후 합계가 원래 숫자와 같으면 디세리움 수이고, 그렇지 않으면 아닙니다.

C++ 구현 예제

위 알고리즘을 C++ 코드로 구현하면 다음과 같습니다.

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

// 숫자의 자릿수 개수를 구하는 함수
int getDigitsCount(int n) {
    int digitsCount = 0;
    do {
        digitsCount++;
        n = n / 10;
    } while (n != 0);
    return digitsCount;
}

// 디세리움 수 여부를 판별하는 함수
bool isDeseriumNumber(int n) {
    int originalNumber = n;
    int digitsCount = getDigitsCount(n);
    int sum = 0;
    while (n != 0) {
        int digit = n % 10;              // 마지막 자릿수 추출
        sum += pow(digit, digitsCount);  // 거듭제곱 값을 합산
        digitsCount--;                   // 지수 감소
        n = n / 10;                      // 다음 자릿수로 이동
    }
    return sum == originalNumber;
}

int main() {
    int n = 135;
    // int n = 123; // 디세리움 수가 아닌 경우 테스트
    if (isDeseriumNumber(n)) {
        cout << "Yes";
    }
    else {
        cout << "No";
    }
    cout << endl;
    return 0;
}

코드 동작 원리

getDigitsCount 함수는 do-while 문을 사용해 숫자를 10으로 나누면서 자릿수를 세어 반환합니다. n이 0으로 입력되더라도 한 번은 실행되므로 안전하게 처리됩니다.

isDeseriumNumber 함수는 원래 숫자를 별도 변수에 저장해 둔 뒤, 반복문에서 각 자릿수를 추출하여 지수를 하나씩 줄여가며 거듭제곱 값을 누적합니다. 모든 자릿수에 대한 연산이 끝나면 합계와 원래 숫자를 비교해 결과를 반환합니다.

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Yes

n 값이 135일 때는 "Yes"가 출력되지만, 주석 처리된 123으로 바꾸면 11 + 22 + 33 = 32가 되어 원래 수와 일치하지 않으므로 "No"가 출력됩니다.

마무리

이번 튜토리얼에서는 디세리움 수의 정의와 함께 C++로 이를 판별하는 전체 과정을 살펴보았습니다. 시간 복잡도는 자릿수에 비례하므로 O(log₁₀n)으로 매우 효율적입니다. 튜토리얼에 대해 질문이 있다면 댓글로 남겨주세요.