디사리움 수(Disarium Number)란?
각 자릿수를 해당 자릿수의 위치만큼 거듭제곱한 값들의 합이 원래 수 자신과 같은 수를 디사리움 수(Disarium Number)라고 합니다.
예를 들어 518의 경우, 왼쪽부터의 자릿수 위치는 각각 1, 2, 3입니다. 따라서 51 + 12 + 83 = 5 + 1 + 512 = 518이 되어 원래 수와 같으므로, 518은 디사리움 수입니다.
자릿수를 구하는 함수: noOfDigits()
noOfDigits(int num) 함수는 입력받은 수를 일의 자리만 남을 때까지 계속 10으로 나누며 자릿수를 셉니다. 반복할 때마다 digits 변수를 1씩 증가시켜 자릿수를 추적하고, while 루프가 종료되면 누적된 자릿수를 반환합니다.
int noOfDigits(int num){ int digits = 0; int temp = num; while (temp){ temp= temp/10; digits++; } return digits;}디사리움 수 판별 함수: isDisarium()
isDisarium(int num)은 불리언(Boolean) 타입의 함수로, 주어진 수가 디사리움 수인지 여부를 검사합니다. 나머지 연산(num % 10)으로 가장 오른쪽 자릿수를 구하고, 이 값을 해당 자릿수의 위치만큼 거듭제곱한 뒤 sum에 더합니다. while 루프는 더 이상 남은 자릿수가 없을 때까지 반복되며, 마지막에 sum이 원래 수 num과 같으면 true를, 그렇지 않으면 false를 반환합니다.
bool isDisarium(int num){ int digits = noOfDigits(num); int sum = 0; int temp = num; while (temp){ int rightDigit = temp%10; sum = sum + pow(rightDigit, digits--); temp = temp/10; } return (sum == num);}예제
다음은 주어진 수가 디사리움 수인지 확인하는 전체 구현 예제입니다. <iostream>으로 입출력을 처리하고, 거듭제곱 계산을 위해 <math.h> 헤더를 포함시킨 점에 유의하세요.
#include<iostream>#include<math.h>using namespace std;int noOfDigits(int num){ int digits = 0; int temp = num; while (temp){ temp= temp/10; digits++; } return digits;}bool isDisarium(int num){ int digits = noOfDigits(num); int sum = 0; int temp = num; while (temp){ int rightDigit = temp%10; sum = sum + pow(rightDigit, digits--); temp = temp/10; } return (sum == num);}int main(){ int num = 518; if( isDisarium(num)) cout <<num<<" is a Disarium Number"<<endl; else cout << num<<" is not a Disarium Number"<<endl; return 0;}실행 결과
위 코드를 컴파일하여 실행하면 다음과 같은 출력이 생성됩니다 −
518 is a Disarium Number
참고: 대표적인 디사리움 수
참고로 1부터 9까지의 모든 한 자리 수는 n1 = n이므로 모두 디사리움 수에 해당합니다. 그 외 대표적인 디사리움 수로는 89, 135, 175, 518, 598, 1306, 1676, 2427 등이 있습니다. 예를 들어 135는 11 + 32 + 53 = 1 + 9 + 125 = 135이므로 디사리움 수입니다. 위 예제의 num 변수 값을 바꾸어 다양한 수를 직접 테스트해 보세요.