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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  1. x为0或1, 则直接返回原值(0的0次方无意义, 也返回0)
  2. 次方为1, 也直接返回原值
  3. 0的负次方无意义, 返回0
  4. 如果是负次幂, 先求出正次幂再求倒数
  5. 如果n是偶数, 将xn拆为x(n/2) * x^(n/2)
    如果n是奇数, 将xn拆为x((n-1)/2) * x^((n-1)/2) * x

代码

class Solution {
     public double myPow(double x, int n) {
        if (x == 0.0 || x == 1.0 || n == 1) {
            return x;
        }
        if (x == 0.0 && n < 0) {
            return 0.0;
        }
        long absN = n;
        // 负次幂先求正次幂
        if (n < 0) {
            absN = -absN;
        }
        double result = pow(x, absN);
        // 负次幂求倒数
        if (n < 0) {
            result = 1.0 / result;
        }
        return result;
    }

    // 如果n是偶数, 将x^n拆为x^(n/2) * x^(n/2)
    // 如果n是奇数, 将x^n拆为x^((n-1)/2) * x^((n-1)/2) * x
    public double pow(double x, long n) {
        if (n == 0) {
            return 1.0;
        }
        if (n == 1) {
            return x;
        }
        // 用右移一位代替除以2, 位运算效率高于数值运算
        double result = pow(x, n >> 1);
        result *= result;
        // 如果是奇次方, 则需要再乘一次基数
        if ((n & 0x1) == 1) {
            result *= x;
        }
        return result;
    }
}

你可能感兴趣的:(剑指Offer.16 数值的整数次方)