leetcode-数值的整数次方

刷leetcode《剑指offer》中第十五题"数值的整数次方",以下记录解题思路。

题目

实现函数double Power(double base, int exponent),求base的exponent次方。
不得使用库函数,同时不需要考虑大数问题。
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

解析

  1. 快速幂法,利用分治法,将n次方分两部分,不断分。

  1. 利用右移,不断累乘。

注意

  1. 右移过程记得防止整数溢出。
  2. 将n划分时候,需要分为偶数奇数,还有正负数。

具体代码实现

第一种方法
class Solution {
   public double myPow(double x, int n) {
       // 底数为0
       if (x == 0) {
            return 0;
        }
       // n为正数
        if (n > 0) {
            return power(x, n);
        }
       // n为负数
        return power(1 / x, -n);
    }

    private double power(double x, int n) {
        // 当n为0
        if (n == 0) {
            return 1;
        }
        // 将n划分两部分
        double r = power(x, n / 2);
        // 判断n是否为奇数,奇数需要多乘一个x
        // 可改为 n&1 == 1
        if (n > 0 ? n % 2 == 1 : (-n) % 2 == 1) {
            return r * r * x;
        } else {
            // 偶数不需要多乘底数
            return r * r;
        }
    }
}
第二种方法
class Solution {
   public double myPow(double x, int n) {
        long n_copy = n;
        // n为负数
        if (n_copy < 0) {
            x = 1 / x;
            n_copy *= -1;
        }
        double result = 1;
        // 进行乘于自身操作
        while (n_copy > 0) {
            // n为奇数
            if (n_copy % 2 == 1) {
                result *= x;
            }
            x *= x;
            n_copy /= 2;
        }
        return result;
   }
}
全部评论

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务