#include<stdio.h>
#include<stdlib.h>
bool g_InputVail = false;
bool equal(double pNum1, double pNum2);
double calculatePowerUnsigned(double pBase, unsigned int pExponent);
double calculatePower(double base, int exponent)
{
g_InputVail = false;
if (equal(base, 0.0)) //底为0的情况 输出为零
{
g_InputVail = true;
return 0.0;
}
unsigned int abs_exponent = (unsigned int)(exponent);
if (exponent < 0)
{
abs_exponent = (unsigned int)(-exponent);
}
double result = calculatePowerUnsigned(base,abs_exponent);
if (exponent < 0)
{
result = 1.0 / result;
}
return result;
}
//比较两个小数是否相等时: 不能采用 “==”简单处理,应该将两数相减的结果与0的邻域范围进行比较
bool equal(double pNum1, double pNum2)
{
if ( ( (pNum1 - pNum2) > -0.0000001 ) && ( ( pNum1 - pNum2 ) < 0.0000001) )
{
return true;
}
else
{
return false;
}
}
double calculatePowerUnsigned(double pBase, unsigned int pExponent)
{
if (pExponent == 0) //递归的终止条件
{
return 1;
}
if (pExponent == 1) //递归的终止条件
{
return pBase;
}
double result = calculatePowerUnsigned(pBase, pExponent >> 1);//右移运算要比除法运算效率高
result *= result;
if ((pExponent & 0x01) == 1) //判断pExponent是否为奇数
{
result *= pBase;
}
return result;
}
int main()
{
int ret = 0;
double test = calculatePower(-1,3);
printf("%f\n",test);
return ret;
}
剑指Offer:面试题11 整数的整数次方
最新推荐文章于 2022-05-13 23:51:43 发布