【剑指Offer学习】【面试题12 :数值的整数次方】

题目描述

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

题目分析

很多人看到这个题基本上心里马上就有一个大致的思路了,就是用一个循环来做base的exponent次方,于是代码很快就能出来

public double solution(double base,int exponent){
    double result = 1.0;
    for(int i=0;i<exponent;i++){
         result = result * base;    
    }
    return result;
}

但是上面的代码只考虑到指数为正整数情况,指数为0或者为负整数情况却没有考虑到。当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。既然有求倒数,我们很自然的就要想到有没有可能对0求倒数,如果对0求倒数怎么办?当底数base是零且指数是负数的时候,我们不做特殊的处理,就会发现对0求倒数从而导致程序运行出错。那么此时我们就要通过抛出异常来反馈这个问题,下面上正确的代码

public class Solution{
    public double Power(double base,int exponent){
        double result = 1.0;
        //当指数为0
        if(exponent ==0){
            return 1.0;
        }
        //当底数无限接近于0 并且指数为负数时,计算时候需要对底数求倒数,此时计算非法
        if(isEqual(base,0.0) && exponent<0){
            throw new Exception("计算非法");
        }


        if(exponent >0){
           result = multiply(base,exponent);
        }else{
           result = multiply(1.0/base,-exponent);
        }
        return result;
    }

    public boolean isEqual(double a, double b){
        if(a-b<0.000001 && a-b>-0.000001){
            return true;
        }
        return false;
    }

    public double multiply(double base,int exponent){
        double sum =1.0;
        for(int i=0;i<exponent;i++){
            sum = sum * base;
        }
        return sum;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值