猿问

如果 y 超过 64,为什么 pow 函数返回 0?

如果 y 大于 64,为什么 pow 的结果为零?


package main


import (

    "fmt"

)


func pow(x uint64, y uint64) uint64 {

    if y > 64 {

        return 0

    }

    var result uint64 = 1

    var counter uint64

    var previous uint64

    for y > 0 {

        previous = result

        result = result * x

        y = y - 1

        counter++

        if result == 0 {

            return previous

        }

    }

    return result

}


func main() {

    result1 := pow(2, 64)

    fmt.Println(result1)

    result2 := pow(2, 32)

    fmt.Println(result2)

    result3 := pow(2, 3)

    fmt.Println(result3)

}

我刚刚意识到这是因为它在base 2中。您对此有何看法?(我对编程和 golang 还是很陌生。)


一只斗牛犬
浏览 150回答 1
1回答

Helenr

你的战俘不应该基于什么是 y。更大的数字会更少。用这个:`// Assuming that b will never be 0func mult(a, b uint64) (uint64, bool) {    result := a * b    return result, (result/b == a)}func pow(x uint64, y uint64) uint64 {if y == 0 {    return 1}if x == 0 {    return 0}var result uint64 = 1var counter uint64var previous uint64var ok boolfor y > 0 {    previous = result    result, ok = mult(result, x)    if !ok {        return 0    }    y = y - 1    counter++    if result == 0 {        return previous    }}    return result}澄清之前的旧答案:实际上应该是 63。这是因为 uint64 最多可以有 2 ^ (64) -1 的最大数字(2 的幂 64 minux 1)。所以 2 次方可以产生的最大数量是 2 ^ 63。您可以通过运行代码来确认这一点。如果您删除 y > 64 的限制,它将为您提供与所有大于 63 的数字相同的结果。(9223372036854775808 或 2^63)。该限制应为 y > 63。
随时随地看视频慕课网APP

相关分类

Go
我要回答