题解 | #数值的整数次方#

数值的整数次方

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合并处理
 * */

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
        }
    }
}


全部评论

相关推荐

lingo12:1.最好加个业务项目,大部分面试官工作以后会更偏重业务 2.实习部分描述一般般,可能hr看到会觉得你产出不够不给你过简历 3.蓝桥杯这些大部分人都有的,不如不写,反而减分项。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务