1、题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
2、分析
这个题需要注意的有几点,首先是判断底是否为0,需要重新写一个函数,因为在计算机内部小数其实是不准确的,可以用两数相减大于一个小的数小于一个大的数判断他们是相等的。其次是根据次方数大于0和小于0分为两种情况。书上对于下面调用的一个私有函数有了更进一步的优化,是通过递归来减少计算。在牛客网上运行时间从4ms到2ms。
3、代码
class Solution {
public:
double Power(double base, int exponent) {
if(equal(base,0.0)) return 0;
double res=0;
if(exponent>0){
res=powerUnsignedExponent(base,exponent);
}
else{
res=1.0/powerUnsignedExponent(base,(unsigned int)(-exponent));
}
return res;
}
private:
bool equal(double num1,double num2){
if((num1-num2)>-0.0000001&&(num1-num2)<0.0000001){
return true;
}
else return false;
}
double powerUnsignedExponent(double base,unsigned int exp){
if(exp==0) return 1;
if(exp==1) return base;
double res=1;
for(int i=1;i<=exp;++i){
res*=base;
}
return res;
}
};
class Solution {
public:
double Power(double base, int exponent) {
if(equal(base,0.0)) return 0;
double res=0;
if(exponent>0){
res=powerUnsignedExponent(base,exponent);
}
else{
res=1.0/powerUnsignedExponent(base,(unsigned int)(-exponent));
}
return res;
}
private:
bool equal(double num1,double num2){
if((num1-num2)>-0.0000001&&(num1-num2)<0.0000001){
return true;
}
else return false;
}
double powerUnsignedExponent(double base,unsigned int exp){
if(exp==0) return 1;
if(exp==1) return base;
double res=powerUnsignedExponent(base,exp>>1);
res*=res;
if(exp&0x1==1) res*=base;
return res;
}
};
4、相关知识点
double型数据判断是否相等。代码完整性。