快速乘
其实快速乘和幂有异曲同工之妙(其实都是乘法)。
这里我们引见我的快速幂中的幂的求法(二进制的按权展开求和)。
快速幂的链接
这里我们发现快速幂是由于多次运算,数据太大,而简化的;而快速乘也是这个道理,那怎么把快速幂转化到快速乘呢?
我们可以发现幂的运算是对于底数的幂次循环所以我们只要把他的幂简化就可以了,而乘法(x*y)是对于x(或y)的y ( x ) 次相加所以把他的y(x)化简就可以了。
怎么样实现
很简单,只要把他的x(y)的二进制按加权求和就可以了。如以下例子:
1211=121011(二进制)=12 * 2^ 3+12 * 2^ 1+12 * 2^0=96+24+12=132
而代码就和幂运算差不多,如下:
int Quick-Multiple(int a,int b)
{
long long int ans=0,int base;
base=a;
while(b)
{
if(b%2==1)
ans+=base;
base=base*2;
b/=2;
}
return ans;
}
当然我们需要取模来保证数据不会溢出最终如下
int Quick-Multiple(int a,int b,int mod)
{
long long int ans=0,int base;
base=a;
while(b)
{
if(b%2==1)
ans=(ans+base)%mod;
base=base*2%mod;
b/=2;
}
return ans%mod;
}
最后老规矩引入例题:
快速乘
这题很简单只要用上面代码引入数据输入输出就行了。
如有错误希望各位大佬指正。
来源:CSDN
作者:目标空
链接:https://blog.csdn.net/qq_45889286/article/details/104200455