zoukankan      html  css  js  c++  java
  • 【剑指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.测试用例

      底数为正数,负数,零

      指数为正数,负数,零

  • 相关阅读:
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行 已解决!
    iis 无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行
    aspx页面,Page_Load 无人进入,解决
    Ajax后台传数组参数,接收不到报错!
    FusionCharts和highcharts 饼图区别!
    redis
    Hibernate不同数据库的连接及SQL方言
    Kafka
    Zookeeper
    BaseDao+万能方法 , HibernateDaoSupport
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8554026.html
Copyright © 2011-2022 走看看