数值的整数次方
题目描述:给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent。求 base 的 exponent 次方。保证 base 和 exponent 不同时为 0 。
分析:能够看懂代码,但是想不到要这么做。
二分快速幂:对于 a^b,普通的求法是用一个循环一直乘 b 个 a,这样的方法对于某些题目来说可能显得比较慢。
二分快速幂是一种利用 b 的二进制特征来快速求 a^b 的算法。
例如:
a = 2, b = 35
则 b 的二进制表示形式为 100011
则 a^b = (2^32) * (2^2) * (2^1)
有了这样的思路之后,就不用循环 b 次了。
假设 b 的二进制表示有 n 位,从后往前依次为第1-n 位,初始结果为 1。则现在只需要从最后一位开始,若该位为 0,则略过,若该位为 1,则结果乘上 a^(2^当前位序号)。最后得到的结果就是 a^b 了。这样循环执行的次数仅为 b 的二进制表示的位数,远小于 b。
PS:与牛客相同!
代码: