题目11:数值的整数次方(leetcode链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/)
题目分析
方法1
利用for循环,expnent为多少就对base进行多少次迭代乘法运算。但是需要考虑下面特殊情况:
1)当expnent为负数,对expnent求绝对值,进行运算再将运算结果求倒数即可。
2)base 和 expnent都为0.0,0的0次方是没有意义的,可以返回0或1
3)当expnent为0时,返回1
4)当expnent为负数,且base为0时,对运算结果求倒数会导致0做分母(被除数)的问题。
方法2
递归求解,我们要求m^32时,我可以先求出m^16在对m^16求平方即可,依次类推求m^16又可以转化为m^8求平方问题。我们可以得到下面的公式
代码描述
方法1
bool equal(double x,double y){
//浮点数不能直接比较大小,当浮点数超出精度范围后,编译器会自动截断超出精度部分,可能会导致两个本不相等的浮点数判断为相等
//一般认为两个浮点数的差值小于0.0000001时两个浮点数就相等
if(x - y > -0.0000001 && x-y < 0.0000001)
return true;
return false;
}
double myPow(double x, int n){
double result = 1.0;
//当x为0且n<0时,为了防止对0求倒数,直接返回0
if(equal(x,0.0) && n < 0){
return 0.0;
}
//当n < 0时,进行|n|次循环在求倒数
int absN = abs(n);
for(int i = 1;i <= absN;i++){
//当x为0.0,n大于0时,result为0
//当n=0,不会进入循环,返回1.0
//当x为0且n为0,也不会进入循环,返回1.0
result *= x;
}
if(n < 0)
return 1.0/result;
return result;
}
方法2
bool equal(double x,double y){
//浮点数不能直接比较大小,当浮点数超出精度范围后,编译器会自动截断超出精度部分,可能会导致两个本不相等的浮点数判断为相等
//一般认为两个浮点数的差值小于0.0000001时两个浮点数就相等
if(x - y > -0.0000001 && x-y < 0.0000001)
return true;
return false;
}
double _power(double x,unsigned int n){
if(n == 0){
return 1;
}
if(n == 1)
return x;
double result = _power(x,n >> 1);
result *= result;
//判断n是否为奇数
if(n & 1 == 1)
result *= x;
return result;
}
double myPow(double x, int n){
double result = 1.0;
//当x为0且n<0时,为了防止对0求倒数,直接返回0
if(equal(x,0.0) && n < 0){
return 0.0;
}
unsigned int absN = (unsigned int)n;
if(n < 0){
absN = -absN;
}
result = _power(x,absN);
if(n < 0)
return 1.0/result;
return result;
}