原理与快速幂相似,利用二进制将两个数的乘法运算转化为加法运算。具体代码如下:

加上取模的话是这样:

  快速乘其实是利用了二进制与乘法分配律。以 2 x 7 为例,因为 7(10) = 111(2) = 100(2)+ 010(2) + 001(2) = 4(10)+2(10)+1(10),也就是 2 x 7 = 2 x ( 4 + 2 + 1 ) = 8 + 4 + 2,从而将乘法转化为加法(对于计算机而言,算加法要比算乘法快得多)

  我们再将快速幂与快速乘对比一下: 快速幂:

int fpow(int a,int b)
{    
    int ans=1;
    while(b)
    {
        if(b&1)
            ans*=a;
        a*=a;
        b>>=1;
    }
    return ans;
}

快速乘:

int mul(int a,int b)
{
    int ans=0;
    while(b)
    {
        if(b&1)
            ans+=a;
        a+=a;
        b>>=1;
    }
    return ans;
}

可以发现,两者之间的差别只有加号与乘号的差别。这是因为,乘法就是若干次加法,而求幂就是若干次乘法。