题目:实现函数double Power(double base,int exponent),求base得exponent次方。不得使用库函数,同时不需要考虑大数问题。
看似简单,实则暗藏玄只因!
次方考虑正数次方、负数次方、零次方
-
正数正常算
-
负数绝对值后算了再求倒数(分数首先考虑到分母为0,题中base可能为0)
-
零次方直接返回1
其中正常算可以考虑递归的O(logn)算法
实现代码:
#include<iostream>
using namespace std;
double PowerRecursion(double base, int exp) {
if (exp == 0)return 1.0;
if (exp == 1)return base;
double result = PowerRecursion(base, exp >> 1);
result *= result;
if (exp & 0b1)
result *= base;
return result;
}
double Power(double base, int exp) {
if (fabs(base - 0.0) < numeric_limits<double>::epsilon()) return 0.0;
if (exp < 0) {
exp = (unsigned int)-exp;
return 1.0/PowerRecursion(base, exp);
}
return PowerRecursion(base, exp);
}
int main()
{
cout << Power(-2, 3) << endl;
cout << Power(-2, -3) << endl;
cout << Power(2, 3) << endl;
cout << Power(2, -3) << endl;
cout << Power(0, 3) << endl;
cout << Power(0, -3) << endl;
cout << Power(-3, 0) << endl;
}
后记
判断两个浮点数 a, b 必须使用减法:
fabs(a - b) < numeric_limits<double>::epsilon()
判断一个数 a 的奇偶性可以使用与运算:
return (a & 0b1)
奇数返回真,偶数返回假。
对于负数转正数,最好加个强制类型转换
(unsigned int)