面试题16:数值的整数次方
题目描述:
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解法一:考虑周到拿offer
思路:
参数 base:
- 若是 0
- 若是 1
参数 exponent:
- 若是负数
- 若是 0
- 若是 1
class Solution {
public:
double Power(double base, int exponent) {
if(exponent == 0) return 1.0;
if(exponent == 1) return base;
if(base == 0.0) return 0.0;
unsigned int absEx = (unsigned int)abs(exponent);
double res = func( base, absEx);
if(exponent < 0) res = (1.0/res);
return res;
}
double func(double base, unsigned int exponent)
{
double res = 1.0;
for(unsigned int i = 1; i <= exponent; i++)
res *= base;
return res;
}
};
解法二:快速乘进行局部优化
思路:
求 a 的 n 次方公式:
class Solution {
public:
double myPow(double base, int exponent) {
if(exponent == 0) return 1.0;
if(exponent == 1) return base;
if(base == 0.0) return 0.0;
if(base == 1.0) return 1.0;
unsigned int absEx = (unsigned int)abs(exponent);
double res = func( base, absEx);
if(exponent < 0) res = (1.0/res);
return res;
}
double func(double base, unsigned int e)
{
if(e == 0) return 1;
if(e == 1) return base;
double res = func(base, e >> 1);
res *= res;
if(e & 0x1 == 1) res *= base;
return res;
}
};