1.在不用库函数的情况下,实现函数 double Power(double base,double exponent),就是求base的exponent次方。
分析:
要考虑全面,可能出现的异常情况,例如当指数为负数,底数为0的情况,相当于是除以0,出产生异常,当底数为负数的时候,应该是先取绝对值,最后再求导数。
通常的做法是循环相乘法,但是这种效率并不是最高的,可以借用二分查找里面的思想,递归的计算2/exponent次方的值,再求平方,这样可以减少计算量。
源码:
/* */
#include<iostream>
#include <math.h>
#include <time.h>
using namespace std;
//#define ONE
#define TWO
bool g_InvalidInput = false;//全局标志位
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);
double Power(double base, int exponent)
{
g_InvalidInput = false;
if (equal(base, 0.0) && exponent < 0)//除数是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;
}
#ifdef ONE
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
double result = 1.0;
for (int i = 1; i <= exponent; ++i)//循环相乘法
result *= base;
return result;
}
#elif defined TWO
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);//类似二分的方法
result *= result;
if ((exponent & 0x1) == 1)
result *= base;
return result;
}
#endif
bool equal(double num1, double num2)//浮点数比较是否为0
{
if ((num1 - num2 > -0.0000001)
&& (num1 - num2 < 0.0000001))
return true;
else
return false;
}
int main()
{
double result = 0;
result = Power(7, 7);//一般情况
cout << "the result is :" << result << endl;
result = Power(0, 7);//0的处理
cout << "the result is :" << result << endl;
result = Power(0, -3);//除数为0的处理
cout << "the result is :" << result << endl;
system("PAUSE");
return 0;
}