• LeetCode 50


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

    示例 1:

    输入: 2.00000, 10
    输出: 1024.00000

    示例 2:

    输入: 2.10000, 3
    输出: 9.26100

    示例 3:

    输入: 2.00000, -2
    输出: 0.25000

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

    说明:

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

    显然,由于 $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;
    }
  • 相关阅读:
    一个 redis 异常访问引发 oom 的案例分析
    从粗放式到精益化编程
    又是一年校招
    xUtils框架的介绍(四)
    xUtils框架的介绍(三)
    hdu 4283 区间dp
    hdu 4632区间dp 回文字串计数问题
    poj 1651 区间dp
    NYOJ 石子合并(一) 区间dp入门级别
    区间dp 整数划分问题
  • 原文地址:https://www.cnblogs.com/dilthey/p/10766396.html
Copyright © 2020-2023  润新知