簡體   English   中英

golang中的100階乘

[英]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

你可以這樣處理

𝑛!=∏𝑛𝑘=1𝑘

ln(𝑎.𝑏)=ln(𝑎)+ln(𝑏)→ln(𝑛!)=ln(∏𝑛𝑘=1𝑘)=∑𝑛𝑘=1(ln𝑛)

因此,您可以計算對數的總和,而不是將所有數字相乘,然后 𝑒𝑥𝑝() 得到結果以得到 𝑛! .

𝑒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))

}

https://play.golang.org/p/74LPoIifNZ-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM