C语言实现俄示乘法

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;
}

运行结果如下:
C语言实现俄示乘法_第1张图片

你可能感兴趣的:(算法块,C语言实现俄式乘法)