原来乘法还可以这样算。

欢迎大家关注我的个人公众号,代码实战。原文在公众号里面。
https://mp.weixin.qq.com/s?__biz=MzI5MzE2Mjc5MQ==&mid=2247483665&idx=1&sn=f97e438343f78190caeb933d62f35565&chksm=ec771b59db00924f983589aec6b0d90ce48a7460a34eb041fe42ed3fa4103c5aa574195d9387&token=1328605126&lang=zh_CN#rd

我们知道乘法是在加法的基础上衍生出来的,乘法的出现可以简化加法的过程。然而,当两个因数过于大时就存在着溢出的风险。所以,我们回归本心,去寻找古人的加法运算方式,再配合二进制的技巧即可解决原本棘手的乘法问题。

对于一个ab,很明显就是b个a相加,然而开暴力循环遍历的话,容易超时,此时当暴力循环无法解决的时候,我们优先想到的是二分思想。比如说,35即5个3相加,十进制5转为2进制即为101(2),那么101(2)就可表示为1个2的2次幂加0个2的1次幂加1个2的0次幂。所以3*5就可以表示为(1 * 2^
2+0 * 2^ 1+1 * 2^ 0)*3。(注:a^b此处表示a的b次幂)而b&1表示位运算‘与’,此时的作用是得到二进制数b的末尾,b&1 == 1表示末尾为1 ,否则为0。而 >> 为位运算右移运算符,即相当于一个箭头从二进制b的最右位向左移动至原来最左端(右移正数左端补0,故当b为0时代表全部二进制位移动完毕)。

代码如下:
原来乘法还可以这样算。_第1张图片

你可能感兴趣的:(ACM-ICPC算法)