快速幂

简介

快速幂就是快速计算底数 xn 次幂,使其时间复杂度为 O(logN),这与朴素的 O(n) 相比有了极大的提高。

快速幂的核心思想就是每一步把指数分成两半,而相应的底数做平方运算,即 526 = 516+8+2 = 516 * 58 * 52

模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public long quickPow(int x, int n) {
    long res = 1;
    while (n != 0) {
        if ((n & 1) == 1) {
            res *= x;
        }
        x *= x;
        n >>= 1;
    }
}

例子

LC 剑指 Offer 16. 数值的整数次方

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

输入:x = 2.00000, n = 10
输出:1024.00000
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Solution {
    public double myPow(double x, int n) {
        if (x == 0)
            return 0;
        long b = n;
        if (n < 0){
            x = 1 / x;
            b = -b;
        }
        double res = 1.0;
        while (b > 0){
            if ((b & 1) == 1)
                res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }
}
updatedupdated2022-06-232022-06-23