美文网首页
[剑指offer][Java]数值的整数次方

[剑指offer][Java]数值的整数次方

作者: Maxinxx | 来源:发表于2019-06-19 18:28 被阅读0次

题目

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

程序核心思想

这个题目就是把所有情况罗列出来就可以了,分类讨论。
要想到,指数要区分大于0、等于0、小于0的情况,因为指数小于0的时候,会出现倒数。
由于会出现倒数,就要考虑到分母为不为0的问题,所以,又要考虑底数是不是0.

所以一共有3*2=6种情况:

序号 情况 结果
1 底数 = 0,指数 > 0 for循环正常算
2 底数 = 0,指数 = 0 1(没意义,但是编译器里的结果为1)
3 底数 = 0,指数 < 0 ∞(根据底数是正0还是负0,有正无穷和负无穷两种情况)
4 底数 != 0,指数 > 0 for循环正常算
5 底数 != 0,指数 = 0 1
6 底数 != 0,指数 < 0 1 / for循环正常算

会出现四种情况(底数不管是不是0,只要指数为0,结果就是1;只要指数大于0,结果就是正常算)。整理如下:

序号 情况 结果
1 指数 = 0 1
2 指数 > 0 for循环正常算
3 底数 = 0,指数 < 0 ∞(根据底数是正0还是负0,有正无穷和负无穷两种情况)
4 底数 != 0,指数 < 0 1 / for循环正常算

按照这四种情况编程即可。

Tips

  • double类型的数是不是0不能通过简单的==来计算,应该看它的绝对值是否小于一个足够小的数。
Math.abs(base) < Math.exp(-6)
  • double 类型的除法(体现在本题中就是对结果取倒数),要注意自动类型转换和强制类型转换。
 return normal(base, exponent);
  • 正无穷和负无穷的表示方法:Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY

代码

public class Solution {
    public double Power(double base, int exponent) {
        if(exponent == 0){
            return 1;
        }
        
        int flag_1 = 1; //正
        if(exponent < 0){
            exponent *= -1;
            flag_1 = 0; //负
        }
        
        int flag_2 = 1;//不是0
        if(Math.abs(base) < Math.exp(-6)){
            flag_2 =0; //0
        }
        
        if(flag_1 == 1){
            return normal(base, exponent);
        }else{
            if(flag_2 == 1){
                return 1.0 / normal(base, exponent);
            }else{
                if(base > 0){
                    return Double.POSITIVE_INFINITY;
                }else{
                    return Double.NEGATIVE_INFINITY;
                }
            }
        }
    }
    public double normal(double base, int exponent){
        int answer = 1; 
        for(int i = 0; i < exponent; i++){
            answer *= base;
        }
        return answer;
    }
}

相关文章

网友评论

      本文标题:[剑指offer][Java]数值的整数次方

      本文链接:https://www.haomeiwen.com/subject/dmokqctx.html