题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
equal功能:判断base是否为0;注:base为double型,防止数据失去精度(此处为细节)
Power功能:实现数值的整数次方
情况1.base=0.0;exponent < 0;
情况2.base != 0;exponent < 0;
UnsignedPower功能:exponent为非负数时,数值的整数次方
为提高效率又将函数UnsignedPower修改为UnsignedPower1
UnsignedPower功能:基于递归调用O(logn)时间a的n次方算法
其中用位运算右移>>代替乘除;用按位与&代替%2来判断一个数是奇数还是偶数(细节!)
注:其中0的0次方无任何意义,返回0或1都可以
由于本人用c语言实现,无bool类型,故定义了宏false与true
全局变量Invalid来测试函数Power的参数exponent是否合法
Power功能:实现数值的整数次方
情况1.base=0.0;exponent < 0;
情况2.base != 0;exponent < 0;
UnsignedPower功能:exponent为非负数时,数值的整数次方
为提高效率又将函数UnsignedPower修改为UnsignedPower1
UnsignedPower功能:基于递归调用O(logn)时间a的n次方算法
其中用位运算右移>>代替乘除;用按位与&代替%2来判断一个数是奇数还是偶数(细节!)
注:其中0的0次方无任何意义,返回0或1都可以
由于本人用c语言实现,无bool类型,故定义了宏false与true
全局变量Invalid来测试函数Power的参数exponent是否合法
#include<stdio.h>
#define false 0
#define true 1
int Invalid = false;
int equal(double num1, double num2)
{
if (num1 - num2 > -0.0000001 && num1 - num2 < 0.0000001)
{
return true;
}
else
{
return false;
}
}
double UnsignedPower1(double base, unsigned int Exponent)
{
if (Exponent == 0)
return 1;
if (Exponent == 1)
return base;
double result = UnsignedPower1(base, Exponent >> 1);
result *= result;
if (Exponent & 0x1)
result *= base;
return result;
}
double UnsignedPower(double base, unsigned int Exponent)
{
double result = 1.0;
for (int i = 1; i <= (int)Exponent; ++i)
result *= base;
return result;
}
double Power(double base, int exponent)
{
double result = 1.0;
if (equal(base, 0.0) && exponent < 0)
{
Invalid = true;
return 0.0;
}
unsigned int Exponent = (unsigned int)exponent;
if (exponent < 0)
{
Exponent = (unsigned int)(-exponent);
}
result = UnsignedPower1(base, Exponent);
if (exponent < 0)
{
result = 1.0 / result;
}
return result;
}
<span style="color:#33ccff;">//测试用例</span>
int main()
{
double ret = Power(0.0, -2);
printf("base = 0.0,exp < 0,ret: %f\n", ret);
ret = Power(0.0, 0);
printf("base = 0.0,exp = 0,ret: %f\n", ret);
ret = Power(0.0, 2);
printf("base = 0.0, exp > 0,ret: %f\n", ret);
ret = Power(2.0, -2);
printf("base > 0,exp < 0,ret: %f\n", ret);
ret = Power(2.0, 0);
printf("base > 0,exp = 0,ret: %f\n", ret);
ret = Power(2.0, 10);
printf("base > 0,exp > 0,ret: %f\n", ret);
ret = Power(-2.0, -2);
printf("base < 0,exp < 0,ret: %f\n", ret);
ret = Power(-2, 0);
printf("base < 0,exp = 0,ret: %f\n", ret);
ret = Power(-2, 3);
printf("base < 0,exp > 0,ret: %f\n", ret);
return 0;
测试结果如下图: