【剑指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.测试用例

  底数为正数,负数,零

  指数为正数,负数,零

 

posted @ 2018-03-13 10:03  wanglei5205  阅读(531)  评论(0编辑  收藏  举报
levels of contents