• 数值的整数次方(剑指offer面试题11)


    实现函数 double Power(double base, int exponent),即乘方运算。

    考虑问题

    • exponet < 0 , 可以转化为 1.0 / Power(base, -1 *exponent)——负数与正数同时处理
    • exponet < 0,并且base=0时,此时应该报错,因为此时0作为除数
    • Power(0, 0) = 1
    • Power(*, 0) = 1

    思路一:常规思路

    #include <iostream>
    using namespace std;
    
    bool InvalidInput = false;
    
    bool equal(double val1, double val2)
    {
        if((val1 - val2 < 0.0000001) && (val1 - val2 > -0.0000001))
            return true;
        else
            return false;
    }
    
    double Power(double val, int exponent)
    {
        InvalidInput = false;
        if(equal(val, 0.0) && exponent < 0)
        {
            InvalidInput = true;
            return 0.0;
        }
        int absExponent = (unsigned int)(exponent);
        double rev = 1.0;
        if(exponent < 0)
            absExponent = (unsigned int)(-exponent);
        for(int i = 0; i < absExponent; ++i)
            rev *= val;
        if(exponent < 0)
            return 1.0 / rev;
        else
            return rev;
    }
    
    
    int main()
    {
        cout << Power(3.3, 3) << endl;
        cout << Power(3.3, -3) << endl;
    }

    注意问题

    1. 计算机表示小数都有误差,所以直接用比较(==)会出现错误,解决的方法是两个数做差,与很小的数比较。
    2. 当base=0 && exponet < 0时,此时输入错误,用InvalidInput作为输出表示

    思路二:递归

    Pow (2, 4) = (Pow(2, 4),  2),这样做会节省时间

    #include <iostream>
    using namespace std;
    
    bool InvalidInput = false;
    
    bool equal(double val1, double val2)
    {
        if((val1 - val2 < 0.0000001) && (val1 - val2 > -0.0000001))
            return true;
        else
            return false;
    }
    
    double Power(double base, int exponent)
    {
        if(exponent == 0)
            return 1;
        else if(exponent == 1)
            return base;
        else if(exponent < 0)
        {
            if(equal(base, 0))
            {
                InvalidInput = true;
                exponent = 0;
                return 0.0;
            }
            return 1.0 / Power(base, -1 * exponent);
        }
        else
        {
            double rev = Power(base, exponent >> 1);
            if(exponent & 1 == 0)
            {
                double rev = Power(base, exponent >> 1);
                return rev * rev;
            }
            else
                return Power(base, exponent - 1) * base;
        }
    }
    
    int main()
    {
        cout << Power(3.3, 3) << endl;
        cout << Power(3.3, -3) << endl;
        cout << Power(3.3, -3) << endl;
        cout << Power(2, -3) << endl;
        cout << "InvalidInput:" << InvalidInput << endl;
        cout << Power(0, -3) << endl;
        cout << "InvalidInput:" << InvalidInput << endl;
    }

    结果

         

    注意问题

    1. 判断奇数偶数,可以用val & 1,位操作比除法快
    2. 同理,处以2,可以用val / 2 代替
  • 相关阅读:
    VTIL & NoVmp 源码简要分析
    无需 Root 使用 IDA 调试 Android Native
    QWB 2021 StandOnTheGaints Writeup
    外部调用可执行文件中的函数
    CISCN 2021 西南赛区 Fix Writeup
    CISCN 2021 西南赛区 Reverse Writeup
    AES Block Cipher Implementation in C
    MTCTF 2021 Inject Writeup
    【题解】电子科技大学第十九届 ACM 程序设计竞赛
    洛谷P2596 [ZJOI2006]书架
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3597534.html
Copyright © 2020-2023  润新知