题解 | #数值的整数次方#
数值的整数次方
http://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00
//核心:考虑base和exponent的各种情况:
/*
* base==0:
* exp>0 结果是0 case1
* exp=0 报错 case2
* exp<0 报错 case3
* base!=0:
* exp>0 使用快速幂方法 case4
* exp=0 结果是1 case5
* exp<0 使用快速幂方法 case6
*
* 还有两种为1的特殊 情况
* base==1: 结果就是1 case7
* exp==1: 结果就是base case8
*
* 注:case4和case6合并处理
* */
/*
* base==0:
* exp>0 结果是0 case1
* exp=0 报错 case2
* exp<0 报错 case3
* base!=0:
* exp>0 使用快速幂方法 case4
* exp=0 结果是1 case5
* exp<0 使用快速幂方法 case6
*
* 还有两种为1的特殊 情况
* base==1: 结果就是1 case7
* exp==1: 结果就是base case8
*
* 注:case4和case6合并处理
* */
public class Solution {
public double Power(double base, int exponent) {
// case1
if (base == 0 && exponent > 0) {
return 0;
}
// case2和case3
if (base == 0 && exponent == 0 || base == 0 && exponent < 0) {
throw new RuntimeException();
}
// case5
if (base != 0 && exponent == 0) {
return 1;
}
//************以上是4种特殊情况处理*************
//case7
if (base==1) {
return 1;
}
//case8
if (exponent==1) {
return base;
}
// case4 和 case6合并处理:base!=0
if (exponent<0) {//指数为负:exp<0
double b=1/base;//base变成倒数
int e=-exponent;//exp变成相反数
//然后就可以按照指数为正数的规则进行计算了
return calculate(b, e);
}else{//指数为正:exp>0
//直接按照指数为正数的规则进行计算
return calculate(base, exponent);
}
}
//按照指数为正数的规则进行计算:快速幂
public double calculate(double base, int exponent){
if (exponent % 2==0) {//exponent为偶数
double res = Power(base, exponent/2);// exponent/2可以优化成exponent >> 1
return res * res;
}else{//exponent为奇数
double res = Power(base, exponent/2);
return res * res * base;//奇数情况比较特殊,因为在除2的时候,向下取整了,所以要乘以一个base
}
}
}
查看30道真题和解析