快速积 快速幂(以及取余)运算C/C++

#include <bits/stdc++.h>
using namespace std;
//简单来说就是把b当成2进制形式,然后累加;
// 2*7=2*(1*2^0+1*2^1+1*2^2)=2*1*2^0+2*1*2^1+2*1*2^2; 
long long FastMul(long long a,long long b) //快速积 a*b 
{
    long long ans=0;
    while(b){
        if(b&1)        //二进制数b各位如果为1 
            ans+=a;        
        a+=a;
        b>>=1;        //右移1位,相当于除以2 
    }
    return ans;

long long FastExp(long long a,long long b)    //快速幂 a^b 
{
    long long ans=1;
    while(b){
        if(b&1)
            ans*=a;
        a*=a;
        b>>=1;
    }
    return ans;
}

//快速积取模简单来说就和上面说明一样,只是每次多一个取余过程,下次运算加上上次的余数;
// 2*7%5=2*(1*2^0+1*2^1+1*2^2)%5=(2*1*2^0%5+2*1*2^1%5+2*1*2^2%5)%5    (不知道是不是这样表达的,嘻嘻) 
long long FastMulMod(long long a,long long b,long long c)    //快速积取模 a*b%c 
{
    long long ans=0;
    while(b){
        if(b&1)
            ans=(ans+a)%c;
        a=(a+a)%c;
        b>>=1; 
    }
    return ans;

long long FastExpMod(long long a,long long b,long long c)    //快速幂取模 a^b%c
{
    long long ans=1;
    while(b){
        if(b&1)
            ans=(ans*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    return ans;

int main()
{
    printf("%ld\n",FastMul(100,100));
    printf("%ld\n",FastExp(2,10));
    printf("%ld\n",FastMulMod(3,93,5));
    printf("%ld\n",FastExpMod(2,9,5));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/linyuan703/article/details/82350284