欢迎来到王正伟的博客

返回顶部

面试题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;
   }
};
posted @ 2020-04-22 01:38  Mr.King~  阅读(351)  评论(0编辑  收藏  举报