剑指Offer_11 数值的整数次方

    实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
    思路:1.指数为负数,底数为0,底数为0且指数同时为0的情况。2.如果输入的指数exponent为32,我们在函数powerWithExponent的循环中需要做31次乘方。但我们可以换一种思路考虑:我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要16次放的基础上再平方一次就可以了。而16次方又是8次方的平方。这样以此类推,我们求32次方只需要5次乘方:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16此方的基础上求32次方。

这里写图片描述

代码1:

    public double power(double base,int exponent) throws Exception{  
        double result = 0.0;  
        if(equal(base,0.0) && exponent<0){  
            throw new Exception("0的负数次幂无意义");  
        }  
        if(equal(exponent,0)){  
            return 1.0;  
        }  
        if(exponent <0){  
            result= powerWithExponent(1.0/base, -exponent);  
        }  
        else{  
            result = powerWithExponent(base,exponent);  
        }  
        return result;  
    }  
    private double powerWithExponent(double base,int exponent){  
        double result = 1.0;  
        for(int i = 1;i<= exponent;i++){  
            result = result*base;  
        }  
        return result;  
    }  
    //判断两个double型数据,计算机有误差  
    private boolean equal(double num1,double num2){  
        if((num1-num2>-0.0000001) && (num1-num2<0.0000001)){  
            return true;  
        }else{  
            return false;  
        }  
    }  
    public static void main(String[] args) throws Exception{  
        E11Power test = new E11Power();  
        System.out.println(test.power(3, -1));  
    }  

代码2:

private double powerWithExponent2(double base,int exponent){  
        if(exponent == 0)  
            return 1;  
        if(exponent == 1)  
            return base;  
        double result = powerWithExponent2(base,exponent >>1);  
        result *= result;  
        if((exponent&0x1) == 1)  
            result *=base;  
        return result;  
    }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值