题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0;
方法一:暴力
思路:底数的指数次方相当于指数个底数(或底数倒数)相乘
时间复杂度O(n),空间复杂度O(1)
①:特殊情况一:底数为0,指数不为0时,返回0;特殊情况二:底数不为0,指数为0时,返回1;
②:当指数为正数时,返回的是指数个底数相乘的结果
③:当指数为负数时,返回的是指数个底数的倒数相乘的结果
public double Power(double base, int exponent) { if(base==0&&exponent!=0){ return 0.00; } if(exponent==0&&base!=0){ return 1.00; } double getPower=1.0; if(exponent>0){ for(int i=0;i<exponent;i++){ getPower*=base; } }else{ for(int i=0;i<Math.abs(exponent);i++){ getPower*=(1/base); } } //if(getPower<=Double.MAX_VALUE&&getPower>=Double.MIN_VALUE){ //return getPower; //} return getPower; }
暴力运行结果:69ms;10548K
方法二:递归法
自己用暴力法做出来后,偷偷看了题解,发现大家提出的快速幂的公式,然后搭配递归,感觉比较不错,于是自己也尝试了下递归的方法,感谢大神们的思路,哈哈。
思路分析(快速幂):递归其实就是首先找到base case;然后需要找的就是递归的当前项和前一项的关系,在本题中,有两种情况:1.指数为偶数;2.指数为奇数
情况1:指数为偶数,则![图片说明](https://www.nowcoder.com/equation?tex=x%5E%7Bn%7D%3Dx%5E%7Bn%2F2%7D*x%5E%7Bn%2F2%7D "图片标题") ;如![图片说明](https://www.nowcoder.com/equation?tex=x%5E%7B8%7D%3Dx%5E%7B4%7D*x%5E%7B4%7D "图片标题") ;
情况2:指数为偶数,则![图片说明](https://www.nowcoder.com/equation?tex=x%5E%7Bn%7D%3Dx%5E%7Bn%2F2%7D*x%5E%7Bn%2F2%7D*x "图片标题") ,如![图片说明](https://www.nowcoder.com/equation?tex=x%5E%7B9%7D%3Dx%5E%7B4%7D*x%5E%7B4%7D*x "图片标题") 。
注:需要注意的是,如果指数小于0的话,则每一项为正指数结果的倒数,代码如下:
public double Power(double base, int exponent) { //base case: if(base==0&&exponent!=0){ return 0.00; } if(exponent==0&&base!=0){ return 1.00; } if(exponent>0){ return exponent%2==0? Power(base,exponent/2)*Power(base,exponent/2):Power(base,exponent/2)*Power(base,exponent/2)*base; }else{ return exponent%2==0? 1/(Power(base,-exponent/2)*Power(base,-exponent/2)):1/(Power(base,-exponent/2)*Power(base,-exponent/2)*base); } }
递归运行结果:47ms;10308k
方法三:调用库函数
在题解里还看到了直接调用库函数的方法,感觉还是比较妙的,顺便测试了一下,哈哈,自己怎么就没想到呢!!!
public double Power(double base, int exponent) { return Math.pow(base,exponent); }
运行结果:47ms;10412k
综上三种结果,递归方法感觉更好一些,大家可以测试下。