面试题11:数字的整数次方
题目:实现函数dboule Power(double base,int exponent)。求base的exponent的次方
看到题目之后第一反应有一道考查细节的题目,因为题目本身似乎太简单了,所以想到了关于次方的几种情况:base为0是无意义,exponent为0时都为0,为负数时相当于求base的-exponent次方的倒数。
double Power(double base,int exponent){
int result = 1.0;
if(base == 0|| exponent == 0){
return 0.0;
}else if(exponent<0){
return 1.0/Power(base,-exponent);
}else{
for(int i=0;i<exponent;i++){
result = result * base;
}
return result;
}
}
但没想到还是错了,而且依旧是细节。首先关于double 0的比较,我们知道计算机采用的是离散的存储方式也就是说不是所有的值都是一一对应的,也就说0 == 0没问题,但是.0.0==0.0是不是就不一定了,因此判断double数是否相等时采用的方法是:相减然后结果在一个很小的区间内就认为是相等、还有就是效率方面,刚开始以为是细节题,所以就没再效率上下功夫,结果确实有好的方法。我采用的方法是最简单的方法,但是我们可以考虑下:若n为偶数,则a^n = (a^n/2)^2,这样计算量就可以减少了一般。为奇数时只要用n-1代替n最后再乘以a就可以了。
double Power(double base,int exponent){
int result = 1.0;
if(base == 0|| exponent == 0){
return 0.0;
}else if(exponent<0){
return 1.0/Power(base,-exponent);
}else{
PowerWithExponent(base,exponent);
return result;
}
}
PowerWithExponent(double base,int exponent){
if(exponent == 0){
return 1;
}
if(exponent == 1){
return base;
}
double res = PowerWithExponent(base,expoent>>1);
res *= res;
if(exponent &0x1 == 1){//指数为奇数
return base * res;
}else{
return res;
}
}