题解 | #数值的整数次方#
数值的整数次方
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 } } }