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