2俄罗斯农夫法的乘法算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告名:俄罗斯农夫法的乘法算法的实现俄罗斯农夫法的乘法算法的实现问题简介:
实现俄罗斯农夫法的乘法算法,算法求m n计算方法如下:
m
2nm iseve n
2
m n
m 1
2n nm isodd
2
要求不能使用乘法和除法实现。
俄罗斯农夫法的乘法算法的实现算法设计方法简介:
先对输入的2个数判断正负,用一个flag去记录结果的正负。
通过位运算的&让m去和1做与运算,判断m的奇偶性,分奇偶性进行不同的处理。
用s记录运算的结果。因为不能用乘除法,所以用移位运算的左移1位相当乘以2,用移位运算的右移1位相当除以2。
程序代码:
#include
void main()
{
int m,n,s,flag;
while(scanf("%d%d",&m,&n)==2) {
flag=0;
if(m<0)
{
flag=1-flag;
m=0-m;
}
if(n<0)
{
flag=1-flag;
n=0-n;
}
s=0;
while(m>=1)
{
if(m&1==1)
s+=n;
m=(m-1)>>1;
n=n<<1;
}
else
{
m=m>>1;
n=n<<1;
}
}
if(flag==0) printf("%d\n",s);
else
printf("-%d\n",s);
}
}
算法介绍:
先对输入的2 个数判断正负,用一个flag 去记录结果的正负flag=0;
if(m<0){flag=1-flag;
m=0-m;}
if(n<0){flag=1-flag;
n=0-n;}
用这段代码可以作为最后结果正负的判断,当flag=0 时,结果为正否则为负。
然后令记录结果的s先清零。然后不断重复以下步骤,直到m=1为止:
“让m 去和1 做&运算,
如果结果为1,(即m为奇数)s加上n的值,m-1再右移1位(即除以2),n 左移1 位(即乘以2)。
如果结果为0, m 右移1 位(即除以2), n 左移1 位(即乘以2)。”
最后输出正负,输出结果s的值。
时间分析复杂度:
O(1)。
实验数据:
输入数据1:39 79
输入数据2:-39 79
输入数据3:1234 4321
实验结果:
输出数据1:3081
输出数据2:-3081
输出数据3:5332114
体会:
用俄罗斯农夫法的乘法算法,可以将乘除法化解成几个像折半,加倍,相加的简单操作,从而加快了乘法的速度。