快速幂的几种实现方式

快速幂算法

快速幂

快速幂还是很常用的,例如codeforce上的这道题目:

快速幂就是快速计算底数的n次幂。其时间复杂度为 O ( l o g ₂ N ) O(log_₂N) O(logN),与朴素的O(N)相比效率有了极大的提高。

原理

快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。

举个例子:

计算 3 10 3^{10} 310,如果按照常规方法去进行计算的话,只能是:
3 × 3 × 3 × 3 × 3 × 3 × 3 × 3 × 3 × 3 × 3 3\times3\times3\times3\times3\times3\times3\times3\times3\times3\times3 3×3×3×3×3×3×3×3×3×3×3
10个3进行相乘,这就需要去进行9次乘法

但是,如果要将其10写为二进制数字的话,应该为 1010 1010 1010,也就是 3 1010 3^{1010} 31010,即为:

3 1000 × 3 000 × 3 10 × 3 0 3^{1000}\times3^{000}\times3^{10}\times3^{0} 31000×3000×310×30

也就是:

3 8 × 3 0 × 3 2 × 3 0 3^{8}\times3^{0}\times3^{2}\times3^{0} 38×30×32×30

这样,便可以使得次幂的计算得到改善

代码实现

常规计算次幂的方法

int pow_normal(int d,int m){
    
    
    int ans = 1;
    while(m--){
    
    
        ans = ans * d;
    }
    return ans;
}

快速幂(一般)

int pow_one(int d, int m){
    
    
    int ans = 1;
    while(m){
    
    
        if(m%2){
    
    ans = ans * d;}
        d = d * d;
        m = m / 2;
    }
    return ans;
}

递归求快速幂

int pow_dg(int d,int m){
    
    
    if(m==1) return d;
    int temp = pow_dg(d,m/2);
    return (m%2==0 ? 1 : m)*temp*temp;
}

位运算求快速幂

int pow_wys(int d,int m){
    
    
    int ans = 1;
    while(m){
    
    
        if(m&1==1){
    
    ans = ans * d;}
        d = d * d;
        m>>1;
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/qq_45575167/article/details/128795740
今日推荐