剑指offer面试题16(java版):数值的整数次方

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/littlehaes/article/details/91411186

welcome to my blog

剑指offer面试题16(java版):数值的整数次方

题目描述

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

思路

  • 按base和exponent取值分情况讨论, 具体见注释
  • 当exponent为负数时,要注意将base取倒数,同时将exponent变成正数,表示base自乘exponent次

复杂度

public class Solution {
    public double Power(double base, int exponent) {
        /*
        底数分成两种:(1)非零, (2)0
        指数分成三种:(1)正数, (2)负数, (3)0
        具体地,
            1.底数非零时,分为两种情况
                1.1指数大于等于0:直接求次方
                1.2指数小于0:base要取倒数; 还要注意把exponent变为正数,表示base自乘exponent次
            2.底数是零时,指数需要分情况讨论
                2.1指数是正数:返回0
                2.2指数是0:返回0(这个自己定义)
                2.3指数是负数:不允许,因为0无法作为分母
        */
        double result=1;
        //1. 
        if(base != 0 ){
            //1.2
            if(exponent<0){
                exponent = -1*exponent;
                base = 1/base;
            }
            //1.1
            for(int i=0; i<exponent; i++)
                result *= base;
            return result;
        }
        //2.1, 2.2
        if(exponent>= 0)
            return 0;
        //2.3
        return 0;
  }
}

更高效的代码

思路

  • 不再采用逐个相乘的方式,也就是指数每次增加1
  • 令指数也成指数变化,比如指数依次为:1,2,4,8,…
  • base^exponent的结果可以根据exponent的奇偶分成两种情况
  • 情况一: exponent为偶数, 那么base^exponent = base^(exponent/2)*base^(exponent/2)
  • 情况二: exponent为奇数, 那么base^exponent = base^((exponent-1)/2)*base^((exponent-1)/2)*base
  • 代码中(exponent-1)/2直接写成exponent/2即可
  • 指数不断除以2,最终会变成…8,4,2,1,0 注意找好递归终止条件
  • 最后要额外注意, 在递归函数中,base是double类型, 因为指数为负数时,底数要取倒数,所以得用double类型, 这是个细节
public class Solution {
    public double Power(double base, int exponent) {
        /*
        底数分成两种:(1)非零, (2)0
        指数分成三种:(1)正数, (2)负数, (3)0
        具体地,
            1.底数非零时,分为两种情况
                1.1指数大于等于0:直接求次方
                1.2指数小于0:base要取倒数; 还要注意把exponent变为正数,作为乘几次的标志
            2.底数是零时,指数需要分情况讨论
                2.1指数是正数:返回0
                2.2指数是0:返回0(这个自己定义)
                2.3指数是负数:不允许,因为0无法作为分母
        */
        double result=1;
        //1. 
        if(base != 0 ){
            //1.2
            if(exponent<0){
                exponent = -1*exponent;
                base = 1/base;
            }
            //1.1
            return PowerCore(base, exponent);
        }
        //2.1, 2.2
        if(exponent>= 0)
            return 0;
        //2.3
        return 0;
  }
    private double PowerCore(double base, int exponent){ // 递归函数中, base是double类型, 为了处理负指数,需要把之前的base取到数
        if(exponent==0)
            return 1;
        double result = 1;
        double yinShu = PowerCore(base, exponent/2);
        if((exponent&1)==1)//如果指数是奇数,结果要多乘一个base
            result *= base;
        result = yinShu*yinShu*result;
        return result;
            
    }
}

猜你喜欢

转载自blog.csdn.net/littlehaes/article/details/91411186
今日推荐