辗转相除法——不一样的视角

辗转相除法

前言:辗转相除是一种求最大公约数的方式,这篇文章其实是想从一些大家平时容易忽略的点入手,深入理解一下辗转相除。

1.证明

在这里插入图片描述
虽然我们在实际编程的时候不需要去考虑原理,我只是希望通过我的证明来为大家提供一些不一样的视角。

2.代码实现

①常规做法求最大公约数

从两个数中较小的一个数开始逐渐往下减,直到遇到最大公约数结束循环。

#include <stdio.h>
int main()
{
	int m = 0, n = 0;
	scanf("%d%d", &m, &n);
	if (m == 0 || n == 0)//这个也很重要,需要考虑到
		{
			if (m == 0)
				printf("最大公约数是%d,最小公倍数是%d\n", n, m);
			else
				printf("最大公约数是%d,最小公倍数是%d\n", m, n);
		}
	else
		{
			int k = (m > n ? n : m);
			while (1)
			{
				if (m % k == 0 && n % k == 0)
					break;
				k--;
			}
			printf("%d\n", k);
		}
		return 0;
}

②常规辗转相除

//法1
#include <stdio.h>
intt main()
{
	int m = 0, n = 0;
	while (scanf("%d%d", &m, &n) != EOF)
	{		if (m == 0 || n == 0)//这个也很重要,需要考虑到
		{
			if (m == 0)
				printf("最大公约数是%d,最小公倍数是%d\n", n, m);
			else
				printf("最大公约数是%d,最小公倍数是%d\n", m, n);
		}
		else
		{
			int k = m % n;
			int p = m * n;
			while (k)//辗转相除实现时,可以不去考虑m > n,因为加入m = 16, n = 28在第一次交换时,已经换过来了。
			{
				m = n;
				n = k;
				k = m % n;
			}
			p = p / n;
			printf("最大公约数是%d,最小公倍数是%d\n", n, p);
		}
	}
	return 0;
}

注意:
1.如果两个数之间有一个数是0,那么他们两个的最小公倍数是0,最大公约数是另外一个不为0的数。
2.最小公倍数就是两个数的乘积除以最大公约数。

③递归法辗转相除

#include <stdio.h>
int gcd(int x, int y)
{
	if (x == 0 || y == 0)//这个也很重要,需要考虑到
	{
		if (x == 0)
			return y;
		else
			return x;
	}
	else
		return gcd(y, x % y);
}
int main()
{
	int m = 0, n = 0;
		while (scanf("%d%d", &m, &n) != EOF)
		{
			int ret = gcd(m, n);
			printf("%d\n", ret);
		}
		return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值