面试题11:数值的整数次方

来源:互联网 发布:u盘pe 知乎 编辑:程序博客网 时间:2024/05/18 22:15
/*
  面试题11
  题目:实现函数double Power(double base,int exponent),求base的exponent次方。不使用库函数,不考虑大数问题。
  需要考虑的是当输入的指数(exponent)为0或负数的情况。
*/
bool g_InvalidInput=false;//采用全局变量来标识是否出错
double Power(double base,int exponent)
{
g_InvalidInput=false;
if(equal(base,0.0)&&exponent<0)
{
g_InvalidInput=true;
return 0.0;
}
unsigned 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;
}
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
double result=1.0;
for(int 1=0;i!=exponent;++i)
result*=result;
return result;
}
//在计算机内表示小数时(float和double型小数)都有误差。判断两个小数是否相等,只能判断它们的绝对值是否在一个很小的范围之内。
bool equal(double num1,double num2)
{
if((num1-num2<0.0000001)&&(num2-num1<0.0000001))
return ture;
else
return false;
}
//在上面的求指数函数中,如果exponent为32,则要计算31次乘法。如果换一种思路,一个数的32次方,只要知道16次方再求平方即可,依次类推,只要五次乘法:先求///平方,再求4次方,8次方,16次方,32次方。
//新的递归实现的PowerWithUnsignedExponent代码如下
double NewPowerWithUnsignedExponent(double base,unsigned int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=NewPowerWithUnsignedExponent(base,exponent>>1);//用右移运算表示除以2
result*=result;
if((exponent&0x1)==1)//用位与运算判断一个数的奇偶性,exponent为奇数时,乘以它本身
result*=base;
return result;
}
//测试用例包括:底数和指数分别设为正数,负数和零。
0 0