题目描述:
实现函数double Power(doublebase, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
解题思路:
当指数为负数的时候:可以先对指数求绝对值,然后算出次方的结果之后再取倒数;
当底数(base)是零且指数是负数的时候:通过全局代码或异常告诉调用者参数有误;
0的0次方的时候:由于0的0次方在数学上是没有意义的,因此无论是输出0还是1都是可以接受的。
#include <iostream>
using namespace std;
class Solution {
public:
// 判断两个浮点数是否相等
bool Equal(double num1, double num2)
{
if ((num1 - num2) > -0.0000001 && (num1 - num2) < 0.0000001)
return true;
else
return false;
}
double WithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
// 递归计算指数
double result = WithUnsignedExponent(base, exponent >> 1);
// 指数是奇数或偶数 如果是奇数的话就多乘一个
if (exponent & 1 == 1)
{
result *= result;
result *= base;
}
else
{
result *= result;
}
return result;
}
double Power(double base, int exponent) {
bool InvalidInput = false;
// 无效输入:底数是零,指数是负数
if (Equal(base, 0.0))
{
InvalidInput = true;
return 0.0;
}
// 指数为正和指数为负,分类处理
double res = 0.0;
if (exponent < 0)
res = 1.0 / WithUnsignedExponent(base, -exponent);
else
res = WithUnsignedExponent(base, exponent);
return res;
}
};
int main()
{
Solution s;
double num = s.Power(2, 3);
cout << num << endl;
system("pause");
return 0;
}