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

文章介绍了计算数值的整数次方的算法,特别是当幂次为负数时的处理方法。通过快速幂和二进制位操作优化计算过程,对于正数幂次,利用位运算拆分并进行移位和乘法;对于负数幂次,先取反再求正数幂次并取倒数。提供的代码示例展示了如何实现这一算法。
摘要由CSDN通过智能技术生成

数值的整数次方

数值的整数次方
关键是幂次为负数的情况。。。

思路

n为正数

快速幂
在这里插入图片描述
在这里插入图片描述

以上例说:将2的13次方拆分为2^1 乘 2^4 乘 2^8
n=13 ---->1+4+8(2的幂次) 0b1101
x = 3 (3 x 3^4 x 3^8)
移位操作的方式来理解这道题.。。。。

        while (n>0){
            //从右往左遍历幂次的二进制
            if(n%2==1){
                total = total*x;
            }
            //每次就变大一位。。 (比如2^1  2^2  2^3 2^4 ....)
            x = x*x;
            //幂次每次右移一位
            n = n>>1;
        }

在这里插入图片描述

package swordPointingToTheOffer;

public class Sixteen {
    //x的n次方
    public static double myPow(double x, int n) {
        double total = 1;

        while (n>0){
            //从右往左遍历幂次的二进制
            if(n%2==1){
                total = total*x;
            }
            //每次就变大一位。。 (比如2^1  2^2  2^3 2^4 ....)
            x = x*x;
            //幂次每次右移一位
            n = n/2;
        }
        return total;
    }

    public static void main(String[] args) {
        System.out.println(13/2);
        System.out.println(myPow(3,3));
    }
}

n为负数

        if(n<0){
            n = -n;
            x = 1/x;
        }

注意:long n2 = n;

package swordPointingToTheOffer;

public class Sixteen {
    //x的n次方
    public static double myPow(double x, int n) {
        double total = 1;
        long n2 = n;
        if(n<0){
            n2 = -n2;
            x = 1/x;
        }

        while (n2>0){
            //从右往左遍历幂次的二进制
            if(n2%2==1){
                total = total*x;
            }
            //每次就变大一位。。 (比如2^1  2^2  2^3 2^4 ....)
            x = x*x;
            //幂次每次减少一位
            n2 = n2>>1;
        }
        return total;
    }

    public static void main(String[] args) {
//        System.out.println(13>>1);
        System.out.println(myPow(2,-2147483648));
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值