LeetCode 50 - Pow(x, n) - [快速幂]

实现 pow(x, n) ,即计算 x 的 n 次幂函数。函数

示例 1:spa

输入: 2.00000, 10
输出: 1024.00000code

示例 2:blog

输入: 2.10000, 3
输出: 9.26100递归

示例 3:io

输入: 2.00000, -2
输出: 0.25000class

解释: 2^(-2) = 1/(2^2) = 1/4 = 0.25di

说明:while

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

 

显然,因为 $n$ 是一个整数,能够使用快速幂来作,对于 $n<0$ 的状况,咱们能够先求出 $x^{|n|}$,最后返回 $1/x^{|n|}$ 便可。

 

AC代码:

class Solution
{
public:
    double myPow(double x,int n)
    {
        bool flag=(n>=0);
        long long p=abs((long long)n);
        double res=1, base=x;
        while(p)
        {
            if(p&1) res*=base;
            base*=base, p>>=1;
        }
        if(flag) return res;
        else return 1.0/res;
    }
};

 

简单解释快速幂的这段代码,

我如今要计算的是 $base$ 的 $p$ 次方,那么只要当 $p>0$,我就要继续计算:

  若是 $p$ 是个偶数,那么显然 $base^p$ 能转化成 $(base^2)^{p/2}$,那么咱们如今转而计算 $base^2$ 的 $p/2$ 次方;

  若是 $p$ 是个奇数,那么显然 $base^p$ 能转化成 $(base^2)^{(p-1)/2} \cdot base$,那么咱们依然要转而计算 $base^2$ 的 $p/2$ 次方;

换句话说,快速幂有以下递归版本:

double fpow(double b,long long p)
{
    if(p==0) return 1.0;
    return fpow(b*b,p/2)*(p&1?b:1);
}

咱们将上述代码写成非递归形式即为:

double fpow(double b,long long p)
{
    double res=1;
    while(p)
    {
        if(p&1) res*=b;
        b*=b, p/=2;
    }
    return res;
}
相关文章
相关标签/搜索