【剑指offer-16】数值的整数次方,C++实现(递归)
原创博文,转载请注明出处!
1.题目
给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方。注意:不得使用库函数,同时不需要考虑大数问题。
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 5 } 6 };
2.思路
# 解题思路(分情况讨论)
- 无效输入:base=0,exponent<0时,错误输入,输出为0并设置全局变量InvalidInput=true。
- 无效输入:base=0,exponent=0时,无效错误,数学上无意义,输出为0和1均可,程序中设置为1。
- 有效输入:exponent > 0时,直接计算;exponent < 0,指数取绝对值计算result,最后result去倒数。
①当程序中出现错误时,三种错误处理方式(异常、返回值、全局变量)的优缺点。

②判断两个浮点数是否相等
// 判断两个浮点数是否相等
bool Equal(double num1,double num2)
{
if((num1-num2) > -0.0000001 && (num1-num2)<0.0000001)
return true;
else
return false;
}
③以时间复杂度O(logn)计算指数
// 以时间复杂度O(logn)求整数的指数(递归)
double WithUnsignedExponent(double base,unsigned int exponent)
{
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
// 递归计算指数
double result = WithUnsignedExponent(base,exponent>>1);
// 指数是奇数或偶数
if(exponent & 1 == 1)
{
result *= result;
result *= base;
}
else
{
result *= result;
}
return result;
}
3.code
#include <iostream>
using namespace std;
// 全局变量:标识无效输入
bool InvalidInput = false;
class Solution {
public:
double Power(double base, int exponent)
{
InvalidInput = false;
// 无效输入:底数是零,指数是负数
if(Equal(base,0.0) && exponent < 0)
{
InvalidInput = true;
return 0.0;
}
// 指数为正和指数为负,分类处理
double res = 0.0;
if(exponent < 0)
res = 1.0/WithUnsignedExponent(base,-exponent);
else
res = WithUnsignedExponent(base,exponent);
return res;
}
// 判断两个浮点数是否相等
bool Equal(double num1,double num2)
{
if((num1-num2) > -0.0000001 && (num1-num2)<0.0000001)
return true;
else
return false;
}
// 以时间复杂度O(logn)求整数的指数(递归)
double WithUnsignedExponent(double base,unsigned int exponent)
{
// 特殊情况
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
// 递归计算指数
double result = WithUnsignedExponent(base,exponent>>1);
// 指数是奇数或偶数
if(exponent & 1 == 1)
result = result * result * base;
else
result = result * result;
return result;
}
};
int main()
{
Solution solution;
double base = 0.0;
int exponent = 0;
cout<<solution.Power(base,exponent)<<endl;
return 0;
}
4.复杂度
时间复杂度O(logn)
5.测试用例
底数为正数,负数,零
指数为正数,负数,零

浙公网安备 33010602011771号