俄式乘法-算法设计与分析-减治法

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)初始化

设定两个变量nm分别代表被乘数和乘数。

初始化结果变量result为0。

2)迭代处理

n大于0时,重复以下步骤:

      1. 如果n是奇数,则将m加到result上。
      2. n右移一位(即整除2),相当于在二进制下舍弃最低位。
      3. 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值