实现函数double Power(double base, int exponent),求base 的exponent次方,不得用库函数(C语言有一个pow函数),同时需要考虑大数问题.
高效率的解决方案如下:
#include "stdafx.h"
#include <math.h>
bool g_InvalidInput = false; //全局变量标识是否出错
bool equal(double num1, double num2); //判断两个double数是否相等
double PowerWithUnsignedExponent(double base, unsigned int exponent); //求基数的指数次方
//求基数的指数次方
double Power(double base, int exponent)
{
g_InvalidInput = false;
if (equal(base, 0.0) && exponent < 0)
{
g_InvalidInput = true;
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;
}
//一般的解决办法
/*
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
double result = 1.0;
/
for(int i = 1; i <= exponent; ++i)
result *= base;
return result;
}
*/
//递归高效率实现指数运算
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1); //除以2用移位操作优化细节
result *= result;
if ((exponent & 0x1) == 1)
result *= base;
return result;
}
//判断相等的函数
bool equal(double num1, double num2)
{
if ((num1 - num2 > -0.0000001)
&& (num1 - num2 < 0.0000001))
return true;
else
return false;
}
// ====================测试代码====================
void Test(double base, int exponent, double expectedResult, bool expectedFlag)
{
double result = Power(base, exponent);
if (abs(result - expectedResult) < 0.00000001
&& g_InvalidInput == expectedFlag)
printf("Test passed.\n");
else
printf("Test failed.\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
// 底数、指数都为正数
printf("Test1 begins.\n");
Test(2, 3, 8, false);
// 底数为负数、指数为正数
printf("Test2 begins.\n");
Test(-2, 3, -8, false);
// 指数为负数
printf("Test3 begins.\n");
Test(2, -3, 0.125, false);
// 指数为0
printf("Test4 begins.\n");
Test(2, 0, 1, false);
// 底数、指数都为0
printf("Test5 begins.\n");
Test(0, 0, 1, false);
// 底数为0、指数为正数
printf("Test6 begins.\n");
Test(0, 4, 0, false);
// 底数为0、指数为负数
printf("Test7 begins.\n");
Test(0, -4, 0, true);
return 0;
}