剑指offer 数值的整数次方

来源:互联网 发布:淘宝短链 编辑:程序博客网 时间:2024/05/01 09:58
链接:https://www.nowcoder.com/questionTerminal/1a834e5e3e1a4b7ba251417554e07c00
来源:牛客网

/**
 * 1.全面考察指数的正负、底数是否为零等情况。
 * 2.写出指数的二进制表达,例如13表达为二进制1101。
 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。
 * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
 */
public double Power(doublebase,int n) {
    doubleres =1,curr = base;
    intexponent;
    if(n>0){
        exponent = n;
    }elseif(n<0){
        if(base==0)
            thrownewRuntimeException("分母不能为0"); 
        exponent = -n;
    }else{// n==0
        return1;// 0的0次方
    }
    while(exponent!=0){
        if((exponent&1)==1)
            res*=curr;
        curr*=curr;// 翻倍
        exponent>>=1;// 右移一位
    }
    returnn>=0?res:(1/res);       
}

分析,实际上是把exponent按成二进制的形式进行表示,例如5=101.进中每一位的因子分别的base*2^2+0+base*2^0.利用&1操作可以判断整数二进制表现形式的最后一位是否为1。
原创粉丝点击