zoukankan      html  css  js  c++  java
  • 面试题16:数值的整数次方(C++)

    题目地址:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/

    题目描述

    实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

    题目示例

    示例 1:

    输入: 2.00000, 10
    输出: 1024.00000
    示例 2:

    输入: 2.10000, 3
    输出: 9.26100
    示例 3:

    输入: 2.00000, -2
    输出: 0.25000
    解释: 2-2 = 1/22 = 1/4 = 0.25

    说明:

    -100.0 < x < 100.0
    n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

    解题思路

    分析题目,求一个整数X的n次方,即Xn利用乘幂原则可以将n拆分:

    • 当n为偶数时,Xn= Xn/2* Xn/2
    • 当n为奇数时,Xn= X(n-1)/2* X(n-1)/2* X

    利用递归或者迭代的方法均可解决,需要注意的是,虽然题目中告诉我们不需要考虑大数问题,但是给出的n可以取到-2147483648−2147483648(整型负数的最小值),因此,需要将n转换成long类型,否则,当new_n = -new_n时会产生因越界而赋值出错。当n<0时,我们将其转化为n>0时的处理,即x=1/x;new_n=-new_n;

    另外一种思路是这样的,当n是偶数,即n%2==0时,Xn=(X* X)n/2;当n是奇数,即n%2==1时,Xn=X*(X* X)n/2;利用递归的思路解决,并且每次递归n都减少一半,故算法的时间复杂度O(logN)。

    程序源码

    递归

    思路2

    class Solution {
    public:
        double myPow(double x, int n) {
            //递归终止条件
            if(n == 0) return 1;
            if(n == 1) return x;
            long num = n;
            bool isNegative = false; //指数正负判断,默认正数
            if(num < 0)
            {
                num = -num;
                isNegative = true;
            }
            double pow = myPow(x * x, num / 2); //递归
            if(n % 2 != 0)
            {
                pow = x * pow;
            }
            return isNegative? 1/pow : pow;
        }
    };
    ```

    思路1

    class Solution {
    public:
        double myPow(double x, int n) {
            long new_n = n;
            if(new_n < 0)
            {
                return 1 / defPow(x, -new_n);
            }
            return defPow(x, new_n);
        }
        double defPow(double x, long n)
        {
            if(n == 0) return 1;
            if(x == 1) return 1;
            if(n % 2 == 0) //指数是偶数时
            {
                double square = myPow(x, n / 2);
                return square * square;
            }
            else //指数是奇数时
            {
                double square = myPow(x, (n - 1) / 2);
                return square * square * x;
            }
        }
    };

    迭代

    class Solution {
    public:
        double myPow(double x, int n) {
           long new_n = n;
           if(new_n < 0)
           {
               x = 1 / x;
               new_n = -new_n;
           }
           double res = 1.00000;
           while(new_n > 0)
           {
               if(new_n % 2 == 1) res *= x;
               x *= x; //x=x2
               new_n /= 2; //或者new_n>>1,右移一位,即删除最后一位
           }
           return res;
       }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    react项目建立导入包问题总结
    React中创建组件的3种方式
    export default与export的区别
    vue中的过滤器
    git clone https://chromium.googlesource.com/失败
    typescript 实现函数重载
    Rename a local and remote branch in git
    使用typescript开发react应用
    自己实现一个Promise库
    【翻译】Webpack 4 从0配置到生产模式
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12749341.html
Copyright © 2011-2022 走看看