您的位置:首页 > Web前端

剑指offer---数值的整数次方(11)

2017-12-08 19:38 375 查看
题目:实现函数double Power(double base,int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数的问题

#include <iostream>
using namespace std;

bool g_InvalidInput = true;
//判断基数是否等于0;
bool equal(double num1,double num2)
{
if( (num1-num2)>-0.0000001 && (num1-num2) < 0.0000001)
{
return true;
}
return false;
}
//计算base、exponent不为0,且exponent大于0
#if 0
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
double result = 1.0;
for(unsigned int i=1;i <= exponent;i++)
{
result *= base;
}
return result;
}
#endif
//效率比较高
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base,exponent>>1);
result *= result;
//指数为奇数
if(exponent & 0x1 ==1)
result *= base;

return result;
}
double Power(double base,int exponent)
{
//base=0,并且指数exponent<0,要对0求倒数,会出错。
if(equal(base,0.0) && exponent < 0)
{
g_InvalidInput = false;
return 0.0;
}
unsigned int absExponent = (unsigned int)exponent;
if(exponent < 0)
absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsignedExponent(base,absExponent);
if(exponent < 0)
{
result = 1.0/result;
}
return result;
}
int main()
{
double tmp = Power(2,-2);
if(g_InvalidInput)
{
cout<<tmp<<endl;
}
else
{
cout<<tmp<<" "<<"输入参数有误"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息