求一个数的整数次方
题目:求一个数的整数次方。
题目是如此的简单,但是需要考虑的还是比较多:
1.指数为负,底数是零;
2.指数底数都是零;
3.返回正常零和返回错误零的区别;
4.底数为正,指数为负如何处理;
5.考虑底数次方大的话,想效率问题;
6.处理double数值相等问题;
以下直接是代码,详细考虑除底数指数全零的以上所有情况!
#pragma once
/*
*base是底数 exponent是指数
*/
bool g_Input = false; //错误时,返回零,和正常返回零区别
double Power(double base, int exponent)
{
g_Input = false;
if (equal(base, 0.0) && exponent < 0) //底数为零,指数为负,即考虑分母为零
{
g_Input = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if (exponent < 0) //如果指数为负,先换成正的处理
absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsingnedExponent(base, absExponent); //最终结果
if (exponent < 0) //如果指数为负,结果就是正数的倒数
result = 1.0 / result;
return result;
}
//将一个数的次方拆分,2为拆分单元 提高效率
double PowerWithUnsingnedExponent(double base, unsigned int exponent)
{
if (exponent == 0) //两个递归出口
return 1;
if (exponent == 1)
return base;
double result = PowerWithUnsingnedExponent(base,exponent>>1); //右移1 表示 除2
result *= result;
if (exponent & 0x1 == 1) //判断奇数偶数
result *= base;
return result;
}
//两个double数是否相等,不能用绝对的相等来写,两个double数满足如下,就判相等
bool equal(double num1, double num2)
{
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
void Test()
{
//PowerWithUnsingnedExponent(2,3);
Power(2,3);
}
赐教!