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

      底数为正数,负数,零

      指数为正数,负数,零

  • 相关阅读:
    Spark Streaming:大规模流式数据处理的新贵
    HBase源码学习系列
    Hadoop源码分析之Configuration
    sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)
    Redis(1.15)Redis监控(待写)
    Redis(1.14)Redis日常管理与维护
    Redis(1.13)Redis cluster 分布式集群手动配置
    (5.3.5)数据库迁移——数据库与文件组的位置迁移(同一实例)
    Redis(1.12)Redis cluster搭建常见错误
    Redis(1.11)Redis4.0.11 cluster 分布式集群搭建
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8554026.html
Copyright © 2011-2022 走看看