题目:
实现函数double Power(double base, int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
本题考查的主要就是考虑问题的周祥,代码的鲁棒性要好
在求整数乘法的地方有一个小技巧需要考虑:
a^n = a^n/2*a^n/2 当n为偶数的时候
a^n = a^n/2*a^n/2*n 当n为奇数的时候(这里的n/2为计算机中的取整的n/2)
使用这个公式的话就会简化很多的循环操作
具体的实现如下:
#include <iostream>
using namespace std;
//判断浮点数相等
bool IsEqual(double base, double number)
{
if(base-number < 0.0000001 && base-number>-0.0000001)
{
return true;
}
return false;
}
//计算乘方
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
double result = 1;
for(int i=0; i<exponent; ++i)
{
result *= base;
}
return result;
}
//更优的计算乘法的方法
double PowerWithUnsignedExponentBetter(double base, unsigned int exponent)
{
if(exponent == 0)
{
return 1;
}
if(exponent == 1)
{
return base;
}
double result = PowerWithUnsignedExponentBetter(base, exponent>>1);
result *= result;
if(exponent & 1)
{
result *=base;
}
return result;
}
//这个题目明确指出不需要考虑大数问题,考察的主要是对问题的考虑是否全面
double Power(double base, int exponent)
{
//这里有个处理的细节,就是double类型的数字判断相等,只要在一定的误差之内的就约定为相等
//如果写成base==0这样的话就是错误的,因为double类型的数在计算机中存储是有误差的
if(IsEqual(base,0.0))
{//如果base是0
if(exponent >= 0 )
{
return 0.0;
}
else
{
exit(-1);//error
}
}
else
{
unsigned int abs_exponent = (unsigned int)exponent;
if(exponent < 0 )
{
abs_exponent = (unsigned int)(-exponent);
}
//double result = PowerWithUnsignedExponent(base, abs_exponent);
double result = PowerWithUnsignedExponentBetter(base, abs_exponent);
if(exponent < 0)
{
result = 1/result;
}
return result;
}
}
int main()
{
cout<<Power(0,0)<<endl;
cout<<Power(0,2)<<endl;
cout<<Power(3,-2)<<endl;
cout<<Power(3,3)<<endl;
cout<<Power(-3,2)<<endl;
cout<<Power(-3,-2)<<endl;
cout<<Power(-2,-3)<<endl;
return 0;
}