팩토리얼 계산은 C 언어 학습 과정에서 자주 등장하는 기초 알고리즘 문제입니다. n 팩토리얼은 1부터 n까지 모든 양의 정수를 곱한 값으로, 수학적으로 n!로 표기합니다. 예를 들어 6! = 6 × 5 × 4 × 3 × 2 × 1 = 720입니다.
C 언어로 팩토리얼을 구현할 때 주로 두 가지 접근법을 사용합니다. 첫째는 함수가 자기 자신을 호출하는 재귀적 방식이며, 둘째는 반복문을 활용한 방식입니다.
재귀적 구현
재귀 방식은 수학적 정의를 코드에 직접 옮긴 것처럼 직관적입니다. n! = n × (n-1)!라는 관계를 이용하며, 기저 사례(base case)로 n이 0이나 1일 때 1을 반환합니다.
#include <stdio.h>
unsigned long long compute_fact(int value) {
if (value <= 1) {
return 1;
}
return value * compute_fact(value - 1);
}
int main(void) {
int input;
printf("정수 입력: ");
scanf("%d", &input);
if (input < 0) {
printf("음수는 팩토리얼이 정의되지 않습니다.\n");
} else {
printf("%d! = %llu\n", input, compute_fact(input));
}
return 0;
}
이 방식의 장점은 코드가 간결하고 이해하기 쉽다는 점입니다. 단점은 깊은 재귀 호출 시 스택 오버플로우가 발생할 수 있으며, 함수 호출 오버헤드로 인해 상대적으로 느릴 수 있습니다.
반복문 구현
반복문을 사용하면 재귀 호출 없이 동일한 결과를 얻을 수 있습니다. 스택 메모리 사용량이 일정하게 유지되며, 대부분의 경우 더 나은 성능을 보입니다.
#include <stdio.h>
unsigned long long iterative_fact(int value) {
unsigned long long product = 1;
int counter;
for (counter = 2; counter <= value; counter++) {
product *= counter;
}
return product;
}
int main(void) {
int number;
printf("계산할 수 입력: ");
scanf("%d", &number);
printf("결과: %llu\n", iterative_fact(number));
return 0;
}
데이터 타입 고려사항
팩토리얼 값은 매우 빠르게 증가합니다. 20!은 이미 2,432,902,008,176,640,000으로 unsigned long long(최대 약 1.8×1019)의 범위를 넘어갑니다. 더 큰 값을 다루려면 여러 워드로 구성된 큰 정수(big integer) 라이브러리를 사용해야 합니다.
| n | n! | 비고 |
|---|---|---|
| 10 | 3,628,800 | int 범위 내 |
| 12 | 479,001,600 | signed int 최대 |
| 20 | ~2.43×1018 | 64비트 한계 |
실무에서는 입력값 검증과 오버플로우 체크를 함께 구현하는 것이 안전합니다.