其他分享
首页 > 其他分享> > 剑指 Offer 16. 数值的整数次方

剑指 Offer 16. 数值的整数次方

作者:互联网

一、题目:

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

 

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

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

提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解析与代码:

  1、最笨的方法,时间复杂度为O(n),超出范围。

class Solution {
public:
    double myPow(double x, int n) {
        double sum=1;
        if(n>0){
            while(n--){
                sum*=x;
            }
            return sum;
        }else{
            while(n++){
                sum*=x;
            }
            return 1/sum;
        }
    }
};

  2、快速幂+递归:

  

将每一个都乘x变为每一次都乘x^2,这样复杂度就由O(n)变为O(logn)。如求2^11,可以变成2^0--->2^2--->2^4--->2^6--->2^8--->2^10*2 ,奇数次最后还要再乘一次x,而偶数次则不用.

 

 

 

class Solution {
public:
    double myPow(double x, int n) {
        long long N=n;
        return n>=0 ? pow(x,N) : 1/pow(x,-N);
    }
    double pow(double x,long long n){
        if(n==0)
            return 1.0;
        double y = pow(x,n/2);
        return n%2==0 ? y*y:y*y*x;
    }
};

 

3、快速幂+二进制位

  如求2^11,11的二进制为:1011 = 2^3+2^1+2^0 ,即2^(2^3+2^1+2^0)  

class Solution {
public:
    double myPow(double x, int n) {
        if(n==0) return 1.0;
        long long N=n;
        if(n<0){
            N=-N;
            x=1/x;
        }
        double res = 1.0;
        while(N>0){
            if((N&1)==1){
                res*=x;
            }
            x*=x;
            N>>=1;
        }
        return res;
    }
};

 

标签:return,Offer,double,sum,16,long,---,pow,次方
来源: https://www.cnblogs.com/lxpblogs/p/16696198.html