50.pow(x,n)


50. Pow(x, n)

难度中等333

实现 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/22 = 1/4 = 0.25

思路描述:因为不用考虑大数问题,所以只需要循环地去计算就可以了,但是单纯的循环去算,比如:

for(int i = 1; i < n; i ++)
x *= x;
是会超时的。

所以我们可以考虑比如我们计算 x^8,就是 x^2 * x^2 * x^2 * x^2,当我们计算出来 x^2 之后就可以只进行三次乘法就可以了,相对于之前的 7 次乘法,时间大大减少了。

也就是 x^n 可以分解成若干个 x^i 的乘积

我们这里使用快速幂进行求解。我们看一下 n 的二进制形式一定是若干个 1 和 0 构成

所以我们可以看出来,每次乘的值都是前一个值的2倍,当 n 对应位为0时跳过

负数幂和正数幂相同,因为除以一个数就相当于乘这个数的倒数。



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

ll quick_pow(ll a, ll b, ll mod) {
    ll ans = 1;
    while (b)
    {
        if (b & 1) ans = (ans*a) % mod;
        a = (a*a) % mod;
        b >>= 1;
    }
    return ans;
}
b是可以为double,
class Solution {
public:
    double  quick_pow(double a, long long  b) {
        double ans = 1;
        while (b)
        {
            if (b & 1) ans = (ans*a) ;
            a = (a*a) ;
            b >>= 1;
        }
        return ans;
    }
    double myPow(double x, int n) {
        if(n==0 || x==1.0){
            return 1.0;
        }
        long long num =n;
        if(num<0){
            num=-num;
            x= 1/x;
        }
        return quick_pow(x,num);
    }
};

文章作者: anlen123
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 anlen123 !
 上一篇
560.和为K的子数组 560.和为K的子数组
560. 和为K的子数组给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :
2020-05-15 anlen123
下一篇 
236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先
236. 二叉树的最近公共祖先难度中等504 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x
2020-05-10 anlen123
  目录