数值的整数次方
数值的整数次方。
在解题的过程中,需要先想清楚解题思路,然后再解题。
在这里,用到了高中学习到的分类讨论的思想:
首先,需要判断 输入参数的范围
- base,分情况讨论:0和非0
- exponent正数和负数,所进行的计算方法不一样.
- exponent为负数时,结果为绝对值的倒数!
- 优化的地方:计算幂函数值,可以使用递归来计算。
基本思路:
- 输入base和exponent.
- 第一步,判断base是否为0,若是,则需要保证exponent>=0;
- 第二步,判断exponent是否为正数,若是,则结果为 base的exponent次方。若是负数,则结果为倒数!
- 计算 base^abs(exponent)次方。
- 根据exponent的正负,返回对应的结果。
我写的代码如下:
publicclassSolution {public double Power(double base, int exponent) {if(base == 0.0 && exponent <=0){return 0.0;}if(exponent == 0){return 1;}double result = 0;boolean positive = exponent < 0?false:true;double absResult = PowerCore(base,exponent);if(positive)result = absResult;elseresult = 1.0/absResult;return result;}// 此处,使用递归来求解/*a^n = a^(n/2)*a^(n/2),n为偶数时;a^n = a^(n/2)*a^(n/2)*a;*/publicdoublePowerCore(doublebase, intexponent) {if(exponent == 0){return1;}if(exponent == 1){returnbase;}// 判断是奇数还是偶数// n & 1的效果,等效于 n%2if((exponent&0x1) == 1){returnbase*PowerCore(base,exponent/2)* PowerCore(base,exponent/2);}else{returnPowerCore(base,exponent/2)* PowerCore(base,exponent/2);}}}
较为简洁的代码如下:
public class Solution {
public double Power(double base, int exponent) {
if(exponent==0 && base != 0)
return 1;
if(exponent==1)
return base;
if(base == 0 && exponent <= 0){
throw new RuntimeException();
}
if(base ==0 && exponent>0){
return 0;
}
int n= exponent;
if(exponent<0){
n = -exponent;
}
double result=Power(base,n>>1);// 此处,使用位运算,来进行取半,值得学习
result*=result;
if((n&1)==1)
result*=base;
if(exponent<0)
result=1/result;
return result;
}
}