剑指offer之数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

解题思路

1.全面考察指数的正负、底数是否为零等情况。
2.写出指数的二进制表达,例如11表达为二进制1011。
3.举例:10^1011 = 10^0001*10^0010*10^1000。
4.通过&1和>>1来逐位读取1011,为1时将该位代表的乘数累乘ret到最终结果。 每位移一次都要翻倍

参考代码

class Solution {
public:
    double Power(double base, int exponent) {
        //考虑1、base为0,exponent<0,无效的输入,2、指数为正,3、指数为负,4、指数为0四种情况即可
        double res = 1.0f; // 初始
        double cur = base; 
        int ex = 0;
        if(exponent==0){
            return 1.0f;
        }
        else if(exponent>0){
            ex = exponent;
        }
        else{
        // 负数的时候分母要处理下
            if(base==0){};
            ex = -exponent;
        }
        // 指数位运算向右移动,不等于0的时候累乘
        while(ex){
            // 位运算中遇到1代表一次累乘
            // 3.举例:10^1011 = 10^0001*10^0010*10^1000。
            if((ex&1)==1){
                res *= cur;
            }
            // 每次位移都要翻倍10^0,10^1,10^2,10^4,10^8
            cur *= cur;
            // 这里一定要重新给ex赋值,不然死循环了
            // ex>>1这样的话ex不会变的,没注意,会死循环
            ex>>=1;
        }
        return exponent>0?res:1/res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值