C++로 큰 수의 팩토리얼(계승) 구하기
팩토리얼은 1부터 n까지의 모든 양의 정수를 곱한 값입니다. 숫자가 조금만 커져도 결과값이 폭발적으로 증가하기 때문에, 큰 수의 팩토리얼을 다룰 때는 일반적인 int 대신 표현 범위가 넓은 unsigned long long int 자료형을 사용하는 것이 좋습니다.
다음은 재귀 함수를 이용해 팩토리얼을 계산하는 C++ 프로그램 예제입니다.
예제 코드
#include <iostream>
using namespace std;
int fact(unsigned long long int n) {
if (n == 0 || n == 1)
return 1;
else
return n * fact(n - 1);
}
int main() {
unsigned long long int n;
cout<<"Enter number : ";
cin>>n;
cout<<"\nThe factorial : "<<fact(n);
return 0;
}실행 결과
Enter number : 19 The factorial : 109641728
코드 설명
큰 수를 저장할 수 있도록 main() 함수에서는 변수를 다음과 같이 선언했습니다.
unsigned long long int n;
unsigned long long int는 일반적으로 64비트 크기를 가지며, 최대 약 1.8 × 1019까지의 값을 표현할 수 있습니다. 다만 팩토리얼은 값이 매우 빠르게 증가하므로 20!까지만 정확하게 담을 수 있고, 그 이상의 값은 오버플로가 발생한다는 점을 유의해야 합니다.
실제 계산 로직은 fact() 함수에 구현되어 있습니다.
int fact(unsigned long long int n) {
if (n == 0 || n == 1)
return 1;
else
return n * fact(n - 1);
}이 함수는 재귀 호출 방식으로 동작합니다. n이 0 또는 1이면 1을 반환하는 기저 조건(base case)을 두고, 그렇지 않으면 n에 fact(n-1)의 반환값을 곱해 반환합니다. 예를 들어 5!는 5 × 4 × 3 × 2 × 1 = 120으로 계산됩니다.
main() 함수에서는 사용자로부터 숫자를 입력받고, fact() 함수를 호출한 뒤 그 결과값을 화면에 출력합니다.
cout<<"Enter number : "; cin>>n; cout<<fact(n);