1.2俄式乘法
俄式乘法(Russian Peasant Multiplication)的概念
俄式乘法是一种古老且简单的算法,用于计算两个正整数的乘积。它基于这样一个观察:如果我们将一个因数连续除以2(取整),同时将另一个因数连续乘以2,那么最终可以将原始乘法问题简化为一系列加法问题。
该方法的核心在于利用了二进制表示中的位移操作和加法运算,实际上是在模拟二进制乘法的过程。当一个数是奇数时,我们保留对应的另一个数作为部分结果;当这个数变成偶数时,我们忽略对应的另一数。通过这种方式,我们可以有效地减少乘法运算的数量,尤其是对于大数乘法而言。
实现过程
n | m | 操作说明 |
50 | 65 | 开始 |
25 | 130 | n为奇数,m=65加入结果,结果=65 |
12 | 260 | n为偶数,跳过 |
6 | 520 | n为偶数,跳过 |
3 | 1040 | n为奇数,m=1040加入结果,结果=1105 |
1 | 2080 | n为奇数,m=2080加入结果,结果=3250 |
(1)初始化
设定两个变量n和m分别代表被乘数和乘数。
初始化结果变量result为0。
(2)迭代处理:
当n大于0时,重复以下步骤:
-
-
- 如果n是奇数,则将m加到result上。
- 将n右移一位(即整除2),相当于在二进制下舍弃最低位。
- 将m左移一位(即乘以2),相当于在二进制下添加一个零到最低位。
-
(3)返回结果:
最终得到的结果就是result。
这种方法之所以有效,是因为它实际上是按照二进制位来逐步累加乘数,只在遇到1的时候进行累加,从而实现了乘法的操作。
关键代码实现
long russianPeasantMultiplication( long n, long m) {
long long result = 0;
while (n > 0) {
// 如果n是奇数,则将m加到结果中
if (n % 2 != 0) {
result += m;
}
// 将n右移一位(整除2)
n >>= 1;
// 将m左移一位(乘以2)
m <<= 1; }
return result;
}