大数乘法转成二进制相乘试用范围

在acm中,经常会碰到俩个数相乘的情况,如果是范围比较小的数相乘,那么可以直接相乘,大不了开long long去存即可,但是如果超过这个范围的话,只能靠其它的解决,一种方法是java中的大数类,一种方法就是二进制相乘法(适用于有余数进行模运算的,要不然得到的结果,你也无法存储,只能用数组进行存储),这里介绍二进制相乘法!见代码如下!!

在下面代码中,我们计算俩个数相乘的结果,转换为对另一个数的二进制枚举累加!!这样就极大的减少了我们的计算量那么是不是对于任意长度的俩个大数相乘都可以用上面方法呢?也就是说一个位数为n的十进制数变为二进制后长度会变化多少呢?答案是可以的!因为这个变化是常数级别。

当仅仅是求俩个数相乘的情况的时候,假设一个十进制数为M,那么它的十进制下位数近似为log10(M)位,而换成二进制下,它的位数是log2(M)(这是以2为底的log函数,没有编辑了)  ,,那么一个十进制数变为二进制的时候,它相当于变化了log5倍,这是一个常数级别。上面所说,也就是说如果仅仅考虑俩个大数相乘,n位的,那么用二进制法后,变成二进制后,位数也就是Log5*n位,是完全可以承受的!!所以完全可以放心的使用!!!


LL ans(LL x, LL y,LL k)
{
	LL res = 0;
	int i, j;
	for (; y>0; y>>=1)                              //一直要将y的位数移完,结束条件为y=0
	{
		if (y & 1)
		{
			res += x;
<span style="white-space:pre">			</span>res %/k;                       //将res的结果保持在0-k之间
		}
		x = (x + x)%k;                         //扩大俩倍
	}
	return res;
}

 

你可能感兴趣的:(大数乘法)