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

C 언어로 플러스 퍼펙트 넘버(암스트롱 수) 판별 프로그램 만들기


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가 성립하며, 본문 예제 코드의 입력값으로 사용된 수이기도 합니다.