剑指 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] 。

解题思路:快速幂

40a7a874523e26cacae9c502a6e8cf8b58dba878739f17e6bb3ed6be76e97569-Picture1

快速幂解析(二分法):

快速幂实际上是一种二分思想的应用

根据二分推导,通过循环赋值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 协议 ,转载请注明出处!

反转链表 Previous
二进制中1的个数 Next