为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只斗牛犬 2022-01-10 16:49:19
如果 y 大于 64,为什么 pow 的结果为零?package mainimport (    "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 还是很陌生。)
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

你的战俘不应该基于什么是 y。更大的数字会更少。


用这个:


`


// Assuming that b will never be 0

func 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 = 1

var counter uint64

var previous uint64

var ok bool

for 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。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信