剑指 Offer 16. 数值的整数次方

本文介绍了如何使用迭代法和快速幂算法解决力扣上的剑指Offer16.数值的整数次方问题。讨论了代码实现细节,包括为什么在判断余数时不使用`n%2==1`以及在处理负指数时的注意事项。同时,提供了一个可能超时的位运算优化版本作为对比。
摘要由CSDN通过智能技术生成

力扣打卡:剑指 Offer 16. 数值的整数次方

解题思路

迭代法的快速幂还是按照已经通过实例的代码来写
否则会出现一些奇奇怪怪的问题

代码

class Solution {
    public double myPow(double x, int n) {
        return quickPow(x,n);
    }
    // 使用快速幂
    public double quickPow(double x, int n){
        double ans = 1;
        boolean flag = n<0 ? true : false;
        if(flag) n = -n;
        while(n!=0){
            if(n%2!=0) { // 问题:为什么不写成 n%2==1 (出错)非0的次方,最终都会到1,统计奇数的单次方只是可以将 2 ^ 4 --> 4 ^ 2 中的每一次转换中,底数的奇数
                ans *= x;
            } // 可以将底数作为原来的平方,那么需要的平方n就减半 也就是 2 ^ n --> ( 2^2 )^ n/2 == 4 ^ n/2
            x *= x;
            n /= 2;
        }
        return flag ? 1/ans : ans;
    }
    void m(double x, int n){
        double ans = 1;
        boolean flag = true;
        if(n<0) {flag = false;n=-n;}
        // 少年不要装逼,使用位运算不熟悉一不注意就超出时间限制
        while(n!=0){ 
            if(n%2 != 0 ){ // (n&1) != 0
                ans *= x;
            }
            x *= x;
            // n >>= 2;
            n /= 2;
        }
        // return flag ? ans : 1/ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值