快速幂

快速幂

1. 主要思路

就是将运算次数减少,比如4次方的话不用乘4次,乘2次就可以了, 乘方,然后再乘方。

int fastPow(int a,int n){
    if(n==1) return a;
    int temp = fastPow(a,n/2);
    // n是奇数
    if (n%2 == 1)
        return temp*temp*a;
    // n是偶数
    else
        return temp*temp;
}

奇数的情况,偶数的情况。

2. 写成迭代

int fastPow(int a,int n){
    long  long base = a;
    long  long  res = 1 ;
    while (n){
        if (n&1)
            res *= base ;
        base *= base;
        n>>=1;
    }

    return res;
}

这里很精巧的结合位运算,比如乘11=8+2+1 ,需要跳过乘4 的情况。用位运算& 就行了。

3. 取模

一般幂运算的结果都非常大,通常需要取模操作,缩小结果。

int fastPow(int a,int n,int mod){
    long  long base = a;
    long  long  res = 1 % mod ;
    while (n){
        if (n&1)
            res = (res* base )% mod;
        base = (base* base)%mod;
        n>>=1;
    }

    return res;
}
posted @ 2021-02-05 01:05  过去的我  阅读(42)  评论(0编辑  收藏  举报