[英]100 factorial in golang
我想在 golang 中計算 100 階乘。 這是我正在使用的代碼。
var fact big.Int
fact.MulRange(1, 100)
打印輸出給出
30414093201713378043612608166064768844377641568960512000000000000
但是谷歌搜索100! 給出9.332622e+157 。 我想這可能是因為我使用的數據類型(或者可能不是)。 我該如何解決? 提前致謝。
編輯:所以我在 go playground 中運行了這段代碼,它給出了正確的答案。 這是由於我的 PC 上的限制嗎? 另外,當我將其轉換為字符串並對其進行迭代時,它會顯示不同的數字
str := fact.String()
for _,val := range str{
fmt.Print(val)
}
這是所有的代碼
package main
import (
"fmt"
"math/big"
)
func main() {
var fact big.Int
fact.MulRange(1, 100)
fmt.Println(fact)
n := fact.String()
fmt.Println(n) //printing 100!
sum := 0
for _, i := range n {
sum += int(i) //sum of each digits in 100!
}
fmt.Println(sum)
}
這是 go env 顯示的內容:
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\user\AppData\Local\go-build
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\user\go
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\user\AppData\Local\Temp\go-build839268890=/tmp/go-build -gno-record-gcc-switches
和 go 版本:go 版本 go1.10.1 windows/amd64
要打印string
值,只需將其按原樣傳遞給fmt.Println()
:
str := fact.String()
fmt.Println(str)
另請注意,您不需要調用它的String()
方法, fmt
包會為您完成。 但如果您只是將fact
傳遞給它,則不會,因為Int.String()
具有指針接收器,因此您必須將指針傳遞給它:
fmt.Println(&fact)
或者首先聲明並使用*big.Int
,然后您可以簡單地傳遞fact
以進行打印:
var fact = new(big.Int)
fact.MulRange(1, 100)
fmt.Println(fact)
實際上,由於big.Int
所有方法都有指針接收者,因此您應該始終聲明和使用big.Int
指針以避免意外。
筆記:
您的原始代碼不打印你想要什么,因為for range
上的繩子范圍超過其符文(字符), rune
是一個別名int32
,所以結果的字符將打印為單獨的數字彼此之間沒有空格(因為你使用fmt.Print()
調用打印每個)。
出於同樣的原因,要計算數字總和,您必須將符文轉換為它們代表的數字的數值。 為此,您可以簡單地使用digit - '0'
:
str := fact.String()
sum := 0
for _, val := range str {
sum += int(val - '0')
}
fmt.Println(sum)
這將打印(在Go Playground 上顯示):
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
648
信用來源:quora
你可以這樣處理
因此,您可以計算對數的總和,而不是將所有數字相乘,然后 𝑒𝑥𝑝() 得到結果以得到 𝑛! .
𝑒ln(𝑛!)=𝑛!
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Hello, playground")
fact(100)
}
func fact(n float64){
var sum float64
sum = 0
var i float64
for i= 1;i<=n;i++{
sum = sum+math.Log(i)
}
fmt.Println(math.Exp(sum))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.