https://www.acmicpc.net/problem/27433
이 문제는 정수 N을 줄때, N 팩토리얼을 출력하는 문제이다.
팩토리얼은 1부터 N까지의 곱을 의미한다. 따라서 5 팩토리얼이면, 5*4*3*2*1=120이다.
이 코드를 짜기 전, C에서는 숫자의 범위가 파이썬처럼 무한하지 않기 때문에, 리턴 타입을 unsigned long int로 설정하였다.
우선 기본 라이브러리를 불러온다.
#include <stdio.h>
그 다음 난 재귀함수로 문제를 풀거기 때문에, factorial함수를 생성한다. (unsigned long int는 부호가 없는 long int이기 때문에, 부호 비트가 없어서 더욱 큰 숫자의 범위를 표현할 수 있다.)
unsigned long int factorial(int n);
함수 내에서는 1보다 n이 크면 재귀적으로 호출하고, 아니면 1을 리턴하는 코드를 넣었다.
if (1 < n){
return n * factorial(n-1);
}else {
return 1;
}
예) 만약 factorial에 5를 넣고 실행하면
n은 1보다 크기 때문에(n = 5) return n * factorial(n-1)을 실행한다. 리턴하기 전, factorial(n-1)의 값을 구한다.
factorial(n-1)(n = 4)에서 n은 1보다 크기 때문에(n = 4) return n * factorial(n-1)을 실행한다. 리턴하기 전, factorial(n-1)의 값을 구한다.
factorial(n-1)(n = 3)에서 n은 1보다 크기 때문에(n = 3) return n * factorial(n-1)을 실행한다. 리턴하기 전, factorial(n-1)의 값을 구한다.
factorial(n-1)(n = 2)에서 n은 1보다 크기 때문에(n = 2) return n * factorial(n-1)을 실행한다. 리턴하기 전, factorial(n-1)의 값을 구한다.
factorial(n-1)(n = 1)에서 n은 더이상 1보다 크지 않기 때문에 1을 리턴한다.
factorial(n-1)(n = 2)에서 이제 factorial(1)의 값을 구했기 때문에, 이제 n * 1 = 2 * 1 = 2를 리턴한다.
factorial(n-1)(n = 3)에서 이제 factorial(2)의 값을 구했기 때문에, 이제 n * 2 = 3 * 2 = 6을 리턴한다.
factorial(n-1)(n = 4)에서 이제 factorial(3)의 값을 구했기 때문에, 이제 n * 6 = 4 * 6 = 24를 리턴한다.
factorial(n-1)(n = 5)에서 이제 factorial(4)의 값을 구했기 때문에, 이제 n * 24 = 5 * 24 = 120을 리턴한다.
main함수에서 scanf로 입력 받고, printf로 factorial 결과 값을 출력한다.
int main(){
int n;
scanf("%d", &n);
printf("%lu", factorial(n));
}
최종 코드
#include <stdio.h>
unsigned long int factorial(int n){
if (1 < n){
return n * factorial(n-1);
}else {
return 1;
}
}
int main(){
int n;
scanf("%d", &n);
printf("%lu", factorial(n));
}
(중간에 팩토리얼 적다가 내 뇌에 혼란이 찾아 왔다...)
'백준 C, C++ 문제' 카테고리의 다른 글
| 25501번, 재귀의 귀재 (0) | 2025.04.13 |
|---|---|
| 10870번, 피보나치 수 5 (0) | 2025.04.13 |
| 10871번, X보다 작은 수 (0) | 2025.04.08 |
| 10807번, 개수 세기 (0) | 2025.04.08 |
| 10818번, 최소, 최대 (0) | 2025.04.07 |