【LeetCode】Pow(x, n) [M](快速幂)

166 篇文章 0 订阅

50. Pow(x, n) - 力扣(LeetCode)

一、题目

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,x^n )。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:​​​​​​​

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:​​​​​​​

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • n 是一个整数
  • -104 <= xn <= 104

二、代码

class Solution {
    public double myPow(double x, int n) {
        // n==0,直接返回1
        if (n == 0) {
            return 1D;
        }

        // 先将n取绝对值,因为如果n为负数,我们需要先按照正数的求解方法求出一个答案,然后在最后用1/ans   这里需要考虑n为系统最小值的情况,因为系统最小值取绝对值还会是自己,所以当n为系统最小值的时候,给n加1,让其不再是系统最小值,这样就可以正常求出来一个绝对值,我们只需要在最后将少乘的那个x再累乘进答案即可
        int pow = Math.abs(n == Integer.MIN_VALUE ? n + 1 : n);
        // 记录答案
        double ans = 1D;
        // 累乘x的次幂
        double t = x;
        // 开始快速幂求解,直到pow右移为0
        while (pow > 0) {
            // 只保留对应的位为1时,将t累乘进ans
            if ((pow & 1) == 1) {
                ans *= t;
            }

            // 对t滚动累乘
            t *= t;
            // pow右移
            pow = pow >> 1;
        }

        // 如果n是系统最小,上面的流程就少累乘了依次,这里再将其补上
        if (n == Integer.MIN_VALUE) {
            ans *= x;
        }

        // 返回答案,如果n为负数,那么答案就是1/ans
        return n < 0 ? 1 / ans : ans;

    }
}

三、解题思路 

一个数的N次方怎么算最快?

t跟自己玩一遍的过程中按位来决定乘不乘到结果里去,一次性不容易求出来10^75次方的结果,我们可以找出75的二进制位就是1001011(很好求,以前学过求二进制的快速方法,就是那每一个二进制位代表的数去凑,能用上的位置就是1,不能用上的就是0),

那么现在我们就去让10自己去乘自己,然后根据75的二进制决定乘到什么时候就将结果添加到总结过中。

流程:

我们设置一个变量ans用来记录最终的结果

首先需要让ans = 1

1、开始第一轮,10,我们看75的二进制位1001011,右数第一位是1,所以这个10要乘到最终的结果中

ans = 1 * 101

2、开始第二轮,101  * 101 ,我们看75的二进制位1001011,右数第二位是1,所以这个101  * 101 也要乘到最终的结果中

ans = 1 * 101 * 102

3、开始第三轮,102  * 102 ,我们看75的二进制位1001011,右数第三位是0,所以这个102  * 102 不能乘到最终的结果中

ans = 1 * 101 * 102

4、开始第四轮,104  * 104 ,我们看75的二进制位1001011,右数第四位是1,所以这个104  * 104 也要乘到最终的结果中

ans = 1 * 101 * 102 * 108

5、开始第五轮,108  * 108 ,我们看75的二进制位1001011,右数第五位是0,所以这个108  * 108 不能乘到最终的结果中

ans = 1 * 101 * 102 * 108

6、开始第六轮,1016  * 1016 ,我们看75的二进制位1001011,右数第六位是0,所以这个1016  * 1016 不能乘到最终的结果中

ans = 1 * 101 * 102 * 108

7、开始第七轮,1032  * 1032 ,我们看75的二进制位1001011,右数第七位是1,所以这个1032  * 1032也要乘到最终的结果中

ans = 1 * 101 * 102 * 108 * 1032

至此,我们就找到了最终的结果ans,注意在整个过程中10的次幂结果都是计算出来的,这里只是为了节约空间就没写出结果,其实在完成上面的7个步骤之后,结果就已经计算出来了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值