C 언어로 GMP 라이브러리를 이용하여 30! 까지 정확하게 계산하기
아래의 소스는 윈도우에서
Luna MinGW & GNU C 4.5.0 (gcc),
로 테스트되었다. long 타입으로는 13! 까지만 정확하계 계산되지만 GMP 를 이용한 계산은 아무리 큰 수의 곱셈이라도 정확히 계산해준다.
- 윈도우에 Luna MinGW (with GCC 4.5.0) 설치하기:
1) Luna MinGW 홈페이지(MinGW GCC C/C++ Compiler package with installer)
2) Luna MinGW 설치파일 다운로드
* 소스 파일명: recFactGMP01.c
* Filename: recFactGMP01.c
*
* Compile: gcc -o recFactGMP01 recFactGMP01.c -lgmp
*/
#include <stdio.h>
#include <gmp.h>
void factorial(mpz_t v, int n) {
int i;
mpz_t t;
mpz_init (t);
mpz_init_set_str (v, "1", 0);
for (i = 1; i <= n; i++) {
mpz_init_set_si (t, i);
mpz_mul(v, v, t);
}
}
int main(int argc, char *argv[]) {
int n1 = 9;
int n2 = 30;
int i;
mpz_t v;
mpz_init (v);
for (i = n1; i <= n2; i++) {
mpz_init_set_si (v, 1);
factorial(v, i);
gmp_printf("%d! = %Zd\n", i, v);
if (i == 13)
printf("-- below calc are regular ----\n");
}
return 0;
}
실행 결과:
프롬프트> recFactGMP01
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
-- below calc are regular ----
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000