【剑指Offer-代码的完整性】面试题16:数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0,同时不需要考虑大数问题(不会溢出)。
思路1
因为不会溢出,可以直接使用循环相乘来求解。当指数(exponent)为整数时,直接返回结果;当指数为负数时,先将指数转为正数求解后,返回倒数,因为\(a^{-b}=\frac{1}{a^b}\)。代码如下:
class Solution {
public:
double Power(double base, int exponent) {
if(exponent==0)
return 1;
if(base==0.0) // base==0也行
return 0;
int absExp = exponent<0? -exponent:exponent;
double ans = 1;
for(int i=0; i<absExp; i++)
ans*=base;
if(exponent<0)
return 1/ans;
else return ans;
}
};
思路2
因为
所以可以用递归来求解。代码如下:
class Solution {
public:
double Power(double base, int exponent) {
if(exponent==0)
return 1;
if(base==0.0) // base==0也行
return 0;
int absExp = exponent<0? -exponent:exponent;
double ans = PowerWithAbsExp(base, absExp);
if(exponent<0)
return 1/ans;
else return ans;
}
double PowerWithAbsExp(double base, int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double ans = PowerWithAbsExp(base, exponent/2);
ans *= ans;
if(exponent%2==1)
ans *= base;
return ans;
}
};
在上面的代码中,可以用右移一位(exponent>>1)代替exponent/2,可以用exponent&1代替exponent%2==1。