题目:给定一个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为偶数
an =
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; } } }