Golang计算较大数值阶乘的实现方法

Golang计算较大数值阶乘的实现方法 我正在尝试使用递归计算数字的阶乘。对于较小的数字效果良好,但如何获取像50、100这样较大数字的正确结果?即使使用uint64作为返回类型,也无法获得合适的值。

func main() {
    fmt.Println("hello world")
}
3 回复

啊,原来是这样。谢谢。

更多关于Golang计算较大数值阶乘的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我找到了这个,也许这正是你需要的

stackoverflow.com

Kshitij Dhakal

在Golang中计算100的阶乘

标签: string, go, math, bigint

package main

import (
	"fmt"
	"math/big"
)

func main() {
	var fact = new(big.Int)
	fact.MulRange(1, 100)
	fmt.Println(fact)
}

在Go语言中,使用递归计算大数阶乘时,由于阶乘结果增长极快,即使是uint64类型也无法容纳像50或100这样较大数字的阶乘结果。例如,50的阶乘约为3.04e+64,而uint64的最大值仅为2^64-1(约1.84e+19)。因此,需要使用能够处理任意精度数值的包,如math/big

以下是一个使用math/big包实现大数阶乘的示例代码:

package main

import (
    "fmt"
    "math/big"
)

// 使用math/big计算阶乘
func factorial(n int64) *big.Int {
    if n < 0 {
        return big.NewInt(0) // 对于负数返回0
    }
    result := big.NewInt(1)
    for i := int64(1); i <= n; i++ {
        result.Mul(result, big.NewInt(i))
    }
    return result
}

func main() {
    // 计算50的阶乘
    num := int64(50)
    result := factorial(num)
    fmt.Printf("Factorial of %d is: %v\n", num, result)

    // 计算100的阶乘
    num2 := int64(100)
    result2 := factorial(num2)
    fmt.Printf("Factorial of %d is: %v\n", num2, result2)
}

输出示例:

Factorial of 50 is: 30414093201713378043612608166064768844377641568960512000000000000
Factorial of 100 is: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

此代码使用math/big.Int类型来处理大整数,通过循环乘法计算阶乘,避免了递归导致的栈溢出问题,并能够精确表示任意大小的整数结果。对于递归方法,在大数值情况下容易导致栈溢出,因此推荐使用迭代方式结合math/big包。

回到顶部