数值的整数次方

时间:2022-10-18 20:37:35

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

这个题看似很简单,貌似用一个循环就能解决问题。就像下面这样:

double Power(double base, int exponent) {
       double ret = 1.0;
       for(int i=1; i<=exponent; i++)
           ret *= base;
       return ret;              
}

可是这是万万不够的,要写出正确高质量的代码还需要斟酌一下,首先得考虑base为0并且指数为负数的情况,不然会出现0作为分母的情况。还有指数为负数的情况,得把指数先当正数算,然后把结果取倒数即可。还有要考虑double的误差,在计算机中不能用==来判断两个double是不是相等,需要特殊处理。这还没完,上面的写法效率也有待提高。实际上,还有一种更高效的算法。举个栗子,要算一个数的8次方,那么知道4次方再平方就可以了。要算4次方,知道2次方再平方就可以了。。。。还可以使用位运算来进一步提高效率。根据这个思想我们不难得出一个公式:

an/2*an/2    n为偶数

a=                                     

     a(n-1)/2*a(n-1)/2*a    n为奇数 

考虑到这些情况我们就不难写出下面比较完整的代码了:

 

public class Solution {
    public double Power(double base, int exponent) {
        if(exponent == 0)
            return 1.0;
        if(exponent == 1)
            return base;
        
        if(isDoubleEqual(base, 0.0) && exponent < 0)
            return 0.0;
        int ex = exponent<0?-exponent:exponent; //考虑指数是负数的情况
        
        double ret = Power(base, ex >> 1);
        ret *= ret;
        if((exponent & 1) == 1) {
            ret *= base;
        }
        
        ret = exponent<0?(1.0/ret):ret;
        
        return ret;
    }
    //判断两个double是否相等,要计算误差
    public boolean isDoubleEqual(double a, double b) {
        if(a - b > -0.0000001 && a - b < 0.0000001) {
            return true;
        }
        else {
            return false;
        }
    }
}