C语言实现俄式乘法
俄式乘法是我们考虑对两个数相乘的非主流算法,假设n和m是两个正整数,我们要计算它们的乘积,同时我们用n的值作为实例规模度量标准。如果n是偶数,则n x m=n/2 x 2m,如果n是奇数,则需对公式做轻微的调整:
n x m= (n-1)/2 x 2m +m。 并且以1 x m=m作为算法结束条件。在n等于奇数时依次加上m的结果一直到m等于1时,最后的值即为最开始相乘的值
例如:
n m
50 65
25 130 m=130
12 260
6 520
3 1040 m=1040+130=1170
1 2080
m=1170+2080=3250
最后的乘积为3250
- 代码演示
分为递归和非递归方法,非递归方法便于理解如代码所示:
#include "stdafx.h"
int Russia(int n, int m)
{
int sum = 0,a=0;
if (n == 1)
return m;
while (n != 1){
if (n % 2 == 0)
{
n = n / 2;//n为偶数时除以二
m *= 2;
printf("%d %d\n", n, m);
}
else{
n = (n - 1) / 2;//n为奇数时,则用n-1除以二
a += m;//然后用a储存当前奇数时m的值
m = m * 2;//m再乘以二
printf("%d %d\n", n, m);
}
}
sum=m+ a;//while循环结束后返回n==1时
//的m的值加上前面奇数储存的a的值得到结果
return sum;
}
int main()
{
int n, m,mul;
printf("请输入要相乘的两个数:");
scanf("%d%d", &n, &m);
mul=Russia(n, m);
printf("最后结果为:%d", mul);
}
- 递归代码块
#include "stdafx.h"
int Russia(int n, int m)
{
if (n == 1)
return m;
if (n % 2 == 0)
{
return Russia(n / 2, m * 2);
}
else{
return Russia((n - 1) / 2, m * 2) + m;
}
}
int main()
{
int n, m, mul;
printf("请输入要相乘的两个数:");
scanf_s("%d%d", &n, &m);
mul = Russia(n, m);
printf("最后结果为:%d", mul);
return 0;
}
运行结果如下: