100 факториалов в Голанге - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу рассчитать 100 факториал в Голанге. Вот код, который я использую.

var fact big.Int
fact.MulRange(1, 100)

Вывод на печать дает

30414093201713378043612608166064768844377641568960512000000000000

Но погуглил 100! дает 9,332622e + 157 . Я подумал, что это, вероятно, из-за типа данных, которые я использую (или, возможно, нет). Как мне это решить? Заранее спасибо.

Редактировать: Итак, я запустил этот код на игровой площадке, и он дал правильный ответ. Это связано с ограничением на моем компьютере? Плюс, когда я конвертирую его в строку и перебираю, он показывает разные числа

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

и вот что показывает 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

1 Ответ

0 голосов
/ 13 сентября 2018

Чтобы напечатать значение 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
...