NowCode

题目描述

给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。

解题思路

下面的讨论中 x 代表 base,n 代表 exponent。

【剑指Offer】16. 数值的整数次方_i++

因为 (x\*x) n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。

函数API

public class Solution {
    public double Power(double base, int exponent) {
        return Math.pow(base, exponent);
  }
}

负值判断

public class Solution {
    public double Power(double base, int exponent) {
       double res = 1.0;
       if(exponent > 0) {
           for(int i = 1; i <= exponent; i++) 
               res *= base;
       }else {
           for(int i = 1; i <= -exponent; i++) 
               res *= base;
           res = 1 / res;
       }
        return res;
    }
}

快速幂

指数用 二进制表示
【剑指Offer】16. 数值的整数次方_递归_02
long类型防止越界
【剑指Offer】16. 数值的整数次方_递归_03
【剑指Offer】16. 数值的整数次方_i++_04
【剑指Offer】16. 数值的整数次方_快速幂_05

class Solution {
    public double myPow(double x, int n) {
        // 快速幂(n用二进制表示,拆分二进制相加,合并逐个相乘)
        if(x == 0) return 0;

        long b = n; // 防止保存int越界 范围2*10的(自我计数法)

        double res = 1.0;
        if(b < 0) {
            b = -b; // 用long防止溢出
            x = 1 / x;
        }
        while(b > 0) {
            if((b & 1) == 1) res *= x; // 累乘 
            x *= x; // 2的次方
            b >>= 1;
        }
        return res;
    }
}