剑指offer-数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

/**
     * 考虑情况: 指数可能为正,负,0.
     * 底数为0,指数为0或者负数,抛异常处理
     * @param base 底数
     * @param exponent 指数 
     * @return
     */
    public static double power(double base, int exponent) {
        // 指数和底数不能同时为0,数学上没有意义
        if(equal(base, 0.0) && exponent <= 0)
            throw new RuntimeException("Invalid Iuput. base and exponent both are zero");
        
        // 指数为0,返回1
        if(exponent == 0)
            return 1.0;
        
        int exp = exponent;

        if(exponent < 0)
            exp = - exp;   
        
        // 求幂次方
        double result = powerWithUnsignedExponent(base, exp);  
        
        // 指数为负,求倒数
        if(exponent < 0) {
            result = 1.0 / result;
        }
        
        return result;
        
    }
    private static double powerWithUnsignedExponent(double base, int exp) {
        double result = 1.0;
        for(int i=1; i<=exp; i++) {
            result *= base;
        }
        return result;
    }
    
    // 比较两个double型数据
    private static boolean equal(double num1, double num2) {
        if((num1 - num2 > -0.0000001) && (num1-num2 < 0.0000001)) 
            return true;
        return false;
    }

优化方法:

private static double powerWithUnsignedExponent1(double base, int exp) {
        if(exp == 0)
            return 1.0;
        if(exp == 1)
            return base;
        double result = powerWithUnsignedExponent(base, exp >> 1);  // 右移代替除以2
        result *= result;
        if((exp & 1) == 1) {   // 判断奇偶次幂,位于代替求余运算
            result *= base;
        }
        return result;
    }

 

posted @ 2016-08-13 15:09  no_one  阅读(155)  评论(0编辑  收藏  举报