【剑指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.测试用例
底数为正数,负数,零
指数为正数,负数,零