추천글
코테 - 암스트롱 수 확인 프로그램 5가지 방법
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
암스트롱 수는 각 자릿수의 값을 해당 자릿수 개수만큼 거듭제곱한 합이 원래 수와 같은 수를 의미합니다(예: 153 = 1³ + 5³ + 3³).
다음은 5가지 구현 방법입니다:
- 기본 반복문: 자릿수를 추출하고 거듭제곱을 계산하는 기본적인 방법.
- 재귀 함수: 자릿수 계산과 합을 재귀적으로 처리.
- 문자열 변환: 숫자를 문자열로 변환해 자릿수를 처리.
- 배열 사용: 자릿수를 배열에 저장해 처리.
- 수학적 최적화: 자릿수 계산을 최소화하는 방법.
암스트롱 수는 각 자릿수의 값을 자릿수 개수만큼 거듭제곱한 합이 원래 수와 같은 수입니다. 예를 들어, 153은 1³ + 5³ + 3³ = 153이므로 암스트롱 수입니다. 아래는 C 언어로 이를 확인하는 5가지 구현 방법입니다.
1. 기본 반복문
숫자의 자릿수를 추출하고, 각 자릿수를 자릿수 개수만큼 거듭제곱하여 합을 계산합니다.
#include <stdio.h>
#include <math.h>
int countDigits(int num) {
int count = 0;
while (num > 0) {
num /= 10;
count++;
}
return count;
}
int isArmstrong(int num) {
int original = num, sum = 0, digits = countDigits(num);
while (num > 0) {
int digit = num % 10;
sum += pow(digit, digits);
num /= 10;
}
return sum == original;
}
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (isArmstrong(num)) {
printf("%d는 암스트롱 수입니다.\n", num);
} else {
printf("%d는 암스트롱 수가 아닙니다.\n", num);
}
return 0;
}
특징: 간단하고 직관적이며, 자릿수 계산과 거듭제곱을 명확히 처리합니다.
2. 재귀 함수
자릿수 계산과 합을 재귀적으로 처리하여 암스트롱 수를 확인합니다.
#include <stdio.h>
#include <math.h>
int countDigits(int num) {
if (num == 0) return 0;
return 1 + countDigits(num / 10);
}
int armstrongSum(int num, int digits) {
if (num == 0) return 0;
int digit = num % 10;
return pow(digit, digits) + armstrongSum(num / 10, digits);
}
int isArmstrong(int num) {
int digits = countDigits(num);
return armstrongSum(num, digits) == num;
}
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (isArmstrong(num)) {
printf("%d는 암스트롱 수입니다.\n", num);
} else {
printf("%d는 암스트롱 수가 아닙니다.\n", num);
}
return 0;
}
특징: 재귀를 사용해 코드가 간결해지며, 함수형 프로그래밍 스타일에 가깝습니다.
3. 문자열 변환
숫자를 문자열로 변환하여 자릿수를 쉽게 처리합니다.
#include <stdio.h>
#include <string.h>
#include <math.h>
int isArmstrong(int num) {
char str[20];
sprintf(str, "%d", num);
int digits = strlen(str), sum = 0;
for (int i = 0; i < digits; i++) {
int digit = str[i] - '0';
sum += pow(digit, digits);
}
return sum == num;
}
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (isArmstrong(num)) {
printf("%d는 암스트롱 수입니다.\n", num);
} else {
printf("%d는 암스트롱 수가 아닙니다.\n", num);
}
return 0;
}
특징: 자릿수 추출이 간단하며, 문자열 처리에 익숙한 개발자에게 적합합니다.
4. 배열 사용
자릿수를 배열에 저장하여 처리합니다.
#include <stdio.h>
#include <math.h>
int isArmstrong(int num) {
int digits[10], index = 0, temp = num, sum = 0;
while (temp > 0) {
digits[index++] = temp % 10;
temp /= 10;
}
for (int i = 0; i < index; i++) {
sum += pow(digits[i], index);
}
return sum == num;
}
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (isArmstrong(num)) {
printf("%d는 암스트롱 수입니다.\n", num);
} else {
printf("%d는 암스트롱 수가 아닙니다.\n", num);
}
return 0;
}
특징: 자릿수를 배열에 저장하여 처리하므로 메모리 사용이 명확합니다.
5. 수학적 최적화
자릿수 계산을 최소화하고, 거듭제곱 계산을 직접 구현하여 최적화합니다.
#include <stdio.h>
int power(int base, int exp) {
int result = 1;
for (int i = 0; i < exp; i++) {
result *= base;
}
return result;
}
int countDigits(int num) {
int count = 0;
while (num > 0) {
num /= 10;
count++;
}
return count;
}
int isArmstrong(int num) {
int original = num, sum = 0, digits = countDigits(num);
while (num > 0) {
int digit = num % 10;
sum += power(digit, digits);
num /= 10;
}
return sum == original;
}
int main() {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
if (isArmstrong(num)) {
printf("%d는 암스트롱 수입니다.\n", num);
} else {
printf("%d는 암스트롱 수가 아닙니다.\n", num);
}
return 0;
}
특징: math.h 의존성을 제거하고, 직접 거듭제곱을 계산하여 효율적입니다.
결론
각 방법은 동일한 결과를 제공하지만, 코드 구조와 효율성에서 차이가 있습니다. 기본 반복문은 초보자에게 적합하고, 재귀는 함수형 접근을 선호하는 경우 유용합니다. 문자열 변환은 간단하며, 배열은 명확한 데이터 관리를 제공합니다. 수학적 최적화는 성능을 중시할 때 적합합니다.
댓글
댓글 쓰기