1.【问题描述】
写一个Power函数,不能调用函数库,同时不需要考虑大数问题。
2.【问题分析】
注意事项:
1.考虑输入的指数小于1(0和负数)的情况
- 当指数为负数时,先对指数求绝对值,算出次方的结果再求倒数。
- 当底数为0且指数是负数时,如果不进行特殊处理,就会出现对0求倒数,从而导致程序运行出错。
- 如果出现了第2种情况,需要告诉函数的调用者出现了这种错误,具体可以采用3种办法:返回值、全局变量和异常。
- 由于0的0次方在数学上没有意义,因此无论输出是0还是1都是可以接受的。
2.需要考虑计算次方时的效率问题。可以借助以下递推公式来解决。
3.【代码示例】
/*
题目:数值的整数次方
作者:郭鹏科:
时间:2019-09-02 9:29
文件名:interviewQuestion_16.cpp
*/
#include<bits/stdc++.h>
using namespace std;
/*
描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
时间:2019-09-02 9:29
函数名:power
*/
bool failsign = false;
double powerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0) //任意数的0次方定义为1
{
return 1;
}
if (exponent == 1)
{
return base;
}
double result = powerWithUnsignedExponent(base, exponent>>1);
result *= result;
if (exponent & 0x1 == 1) //这句话最后执行
{
result *= base;
}
return result;
}
double power(double base, int exponent)
{
if (fabs(base) < 1e-15 && exponent < 0) //处理0的负数次方
{
failsign = 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;
}
int main()
{
cout <<power(2, 10) << endl;
return 0;
}