Go 언어의 int64 타입은 C 언어의 long long 터입처럼 64비트 부호 았는 정수 타입이다. 이 타입으로는 20! 까지만 정확하게 게산된다. (Go 언어의 int64 타입으로 계산 가능한 최대 팩토리얼은?  참조) 하지만 Go 언어의 "math/big" 패키지를 사용하면 (C 언어의 GMP 라이브러리를 쓰는 것 처럼) 무제한 자리수의 정수 계산이 가능하다.

다음 소스는 C 언어로 GMP 라이브러리를 이용하여 30! 까지 정확하게 계산하기의 C 언어 소스 recFactGMP01.c를 Go 언어용으로 수정한 것이다.



* 소스 파일명: recBigFact01.go

/*
 *  Filename: recBigFact01.go
 *
 *  Execute: go run recBigFact01.go
 *
 *  or
 *
 *  Compile: go build recBigFact01.go
 *  Execute: ./recBigFact01
 */

package main

import (
    "fmt"
    "math/big"
)

func factorial(v *big.Int, n int64)  *big.Int {
    var i int64
    var t *big.Int = big.NewInt(1)
    v = big.NewInt(1)
    for i = 1; i <= n; i++ {
        t = big.NewInt(i)
        v = v.Mul(v, t)
    }
    return v
}

func main() {
    var i int
    var n1 int = 9
    var n2 int = 30
    var v *big.Int
    // mpz_init (v);
    for i = n1; i <= n2; i++ {
        v = big.NewInt(1)
        v = factorial(v, int64(i))
        fmt.Printf("%d! = %s\n", i, v)
        if i == 20 {
            fmt.Printf("-- below calc are regular ----\n")
        }
    }
}

 


실행 결과:
프롬프트> go run recBigFact01.go
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
-- below calc are regular ----
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000



 

Posted by Scripter
,