n자리 숫자 x가 주어졌을 때, 그 수가 플러스 퍼펙트 넘버(Plus Perfect Number)인지 판별하는 것이 이 글의 목표입니다. 판별 방법은 각 자릿수 d에 대해 자릿수 개수만큼 거듭제곱(d^n)을 구한 뒤 모두 더하고, 그 합이 원래 수와 같은지 비교하는 것입니다. 합이 원래 수와 일치하면 그 수는 플러스 퍼펙트 넘버이며, 이는 흔히 암스트롱 수(Armstrong Number) 또는 자기연상수(Narcissistic Number)라 불리는 개념과 같습니다.
예를 들어 3자리 수 371의 경우 3³ + 7³ + 1³ = 27 + 343 + 1 = 371로 원래 수와 일치하므로 플러스 퍼펙트 넘버입니다.
예시
입력: 163 출력: 완전수(perfect_number)가 아닙니다 설명: 1³ + 6³ + 3³ = 1 + 216 + 27 = 244 ≠ 163 입력: 371 출력: 완전수(perfect_number)입니다 설명: 3³ + 7³ + 1³ = 27 + 343 + 1 = 371
문제 해결 접근 방식
- 1단계: 입력받은 수의 자릿수 개수를 센다.
- 2단계: 각 자릿수를 자릿수 개수만큼 거듭제곱한다.
- 3단계: 모든 거듭제곱 값을 더한 뒤 원래 수와 같은지 비교한다.
알고리즘
시작
함수 int power(int a, int b)
1단계 → power를 선언하고 1로 초기화한다.
2단계 → b > 0인 동안 반복한다.
power = power * a 로 설정한다.
b를 1씩 감소시킨다.
3단계 → power를 반환한다.
power 함수 끝
함수 int count(int n)
1단계 → i를 선언하고 0으로 초기화한다.
2단계 → n != 0인 동안 반복한다.
i를 1 증가시킨다.
n = n / 10 으로 설정한다.
반복문 끝
3단계 → i를 반환한다.
count 함수 끝
함수 int perfect_number(int n)
1단계 → x를 count(n)의 반환값으로 초기화한다.
2단계 → rem과 m을 각각 0으로 선언 및 초기화한다.
3단계 → n이 0이 아닌 동안 반복한다.
rem을 n % 10 으로 설정한다.
m을 m + power(rem, x) 로 설정한다.
n을 n / 10 으로 설정한다.
반복문 끝
4단계 → m을 반환한다.
perfect_number 함수 끝
함수 int main(int argc, char const *argv[])
1단계 → n을 1634로 초기화한다.
2단계 → n == perfect_number(n)이면 "Number is a perfect_number"를 출력한다.
3단계 → 그렇지 않으면 "Number is not a perfect_number"를 출력한다.
main 함수 끝
종료
C 코드 예제
#include <stdio.h>
int power(int a, int b) {
int power = 1;
while(b > 0) {
power *= a;
b--;
}
return power;
}
int count(int n) {
int i = 0;
while(n != 0) {
i++;
n = n / 10;
}
return i;
}
int perfect_number(int n) {
int x = count(n);
int rem = 0, m = 0;
while(n) {
rem = n % 10;
m += power(rem, x);
n /= 10;
}
return m;
}
int main(int argc, char const *argv[]) {
int n = 1634;
if(n == perfect_number(n)) {
printf("Number is a perfect_number\n");
}
else
printf("Number is not a perfect_number\n");
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Number is a perfect_number
참고: 대표적인 플러스 퍼펙트 넘버
3자리 수 중에서는 153, 370, 371, 407이, 4자리 수 중에서는 1634, 8208, 9474가 플러스 퍼펙트 넘버에 해당합니다. 특히 1634는 1⁴ + 6⁴ + 3⁴ + 4⁴ = 1 + 1296 + 81 + 256 = 1634가 성립하며, 본문 예제 코드의 입력값으로 사용된 수이기도 합니다.