剑指 Offer 16. 数值的整数次方
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
解题思路:快速幂
快速幂解析(二分法):
快速幂实际上是一种二分思想的应用
根据二分推导,通过循环赋值x = x^2,每次把幂降为n//2,直到幂等于0
设res = 0
,初始化x^n = x^n * res
,循环二分时,将多出的一项乘入res,最终返回res便可得到最终答案
循环 | x^n * (res) |
---|---|
第零轮 | 3^5 * (1) |
第一轮 | 9^2 * (1 * 3) |
第二轮 | 81^1 * (1 * 3) |
第三轮 | 6561^0 * (1 * 3 * 81) |
返回 | 1 * 3 * 81 |
AC代码
class Solution {
public:
double myPow(double x, int n) {
if(x == 0) return 0;
long b = n;
double res = 1.0;
if(b < 0){
x = 1 / x;
b = -b;
}
while(b > 0){
//如果n % 2 == 1,即幂为奇数,那么额外多出一个x,乘入res
if(b&1==1) res *= x;
//循环x = x^2
x *= x;
//n //= 2
b >>= 1;
}
return res;
}
};
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!