이번 글에서는 사용자로부터 입력받은 숫자 n이 암스트롱 수(Armstrong Number)인지 아닌지를 판별하는 프로그램을 C 언어로 작성해 보겠습니다.
암스트롱 수란?
암스트롱 수란 각 자릿수를 자릿수의 개수(n, 즉 자릿수의 차수)만큼 거듭제곱한 후, 그 값들을 모두 더한 합이 원래의 숫자와 같아지는 수를 말합니다.
예를 들어 1634는 네 자리 숫자이며, 각 자릿수를 4제곱하여 더하면 다음과 같습니다.
1⁴ + 6⁴ + 3⁴ + 4⁴ = 1 + 1296 + 81 + 256 = 1634
결과가 원래 숫자인 1634와 같으므로 1634는 암스트롱 수입니다.
공식
일반적인 형태의 공식은 다음과 같습니다.
wxyz…. = pow(w, n) + pow(x, n) + pow(y, n) + pow(z, n) + …..
여기서 n은 해당 숫자의 총 자릿수를 의미합니다.
알고리즘
암스트롱 수를 판별하기 위한 전체 알고리즘은 다음과 같습니다.
START
Step 1-> 거듭제곱 연산을 수행하는 함수 선언
int power(int a, int b)
b > 0 인 동안 반복
power = power * a
b를 1씩 감소
반복 종료
power 반환
End
Step 2-> 숫자의 자릿수(차수)를 세는 함수 선언
int count(int n)
i를 선언하고 0으로 초기화
n != 0 인 동안 반복
i를 1 증가
n을 10으로 나눈 값을 다시 n에 저장
반복 종료
i 반환
End
Step 3-> 암스트롱 수 여부를 계산하는 함수 선언
int armstrong(int n)
x를 선언하고 count(n) 함수의 결과값을 대입
rem = 0, m = 0 으로 초기화
n이 참(0이 아님)인 동안 반복
rem = n % 10
m = m + power(rem, x)
n = n / 10
반복 종료
m 반환
End
Step 4-> main 함수 선언
int main(int argc, char const *argv[])
n = 1634 로 초기화
armstrong 함수를 호출하고 반환값이 n과 같은지 비교
참이면 "암스트롱 수입니다" 출력
End if
Else
"암스트롱 수가 아닙니다" 출력
End
STOPC 언어 구현 예제
위 알고리즘을 실제 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 armstrong(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 == armstrong(n)){
printf("%d is an armstrong number \n",n);
}
else
printf("%d isn't an armstrong number \n",n);
return 0;
}코드 설명
- power() 함수: 밑(a)과 지수(b)를 받아 a의 b제곱 값을 계산하여 반환합니다.
- count() 함수: 숫자를 10으로 계속 나누면서 자릿수를 세어 반환합니다.
- armstrong() 함수: 각 자릿수를 추출하고(count 함수로 구한 자릿수만큼 거듭제곱), 그 합계를 반환합니다.
- main() 함수: 원래 숫자와 armstrong 함수의 반환값을 비교하여 암스트롱 수 여부를 출력합니다.
실행 결과
1634 is an armstrong number
1634는 네 자리 숫자이므로 각 자릿수를 4제곱하여 모두 더한 값이 1634로 원래 숫자와 일치하기 때문에, 프로그램은 1634가 암스트롱 수임을 정상적으로 판별합니다.