算法——快速幂

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
链接: leetcode.

解题思路:暴力的方法就是一个一个乘,时间是O(n)的。快速幂的核心思想就是,用位的方式,快速相乘。幂的本质是,幂函数参数转化为二进制,位值为一的位数的常数次方,然后将各个位的这种次方相乘,就是幂的答案,这里的常数就是下面的那个数。这样时间复杂度是O(1)的。

class Solution {
    public double myPow(double x, int n) {
        if(n == 0 || x == 1) return 1;
        if(x == 0) return 0; 
        double res = 1;

        boolean flag = false;

        if(n < 0) {
            flag = true;
            n = -n;
        }

		// 算子
        double temp = x;

        while(n != 0) {
        	// 如果当前位为1,那么说明这个时候需要这个算子
            if((n & 1) == 1) res *= temp;

			// 位移,然后将算子次方
            n >>>= 1;
            temp *= temp;
        }

        if(flag) res = 1/res;

        return res;
    }
}
```
posted @ 2020-11-09 19:58  lippon  阅读(93)  评论(0)    收藏  举报