目录
一、最大公约数
1.辗转相除法
该方法又名阿基里德算法,利用取余运算的方法得到最大公约数。
代码实现:
#include <stdio.h>
//辗转相除法
int gcd(int x, int y)
{
int c = 1;
while (c > 0)
{
c = x % y;
x = y;
y = c;
}//若原本形参x<y,则经过第一轮循环,两数已交换,因此,无需判断两数的大小关系
return x;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);//输入需要求最大公约数的两整数
int n = gcd(a, b);
printf("%d\n", n);//输出最大公约数
return 0;
}
解释:
辗转相除法求最大公约数是数学方法,其原理不深究。
该方法为循环和取余运算的结合,当余数不为0时,循环持续进行,每进行一次取余运算,将y的值赋给x,将余数的值赋给y,直到余数为0时(y的值赋给x,余数的值赋给y,故结束循环时,余数和y的值均为0),返回x,此时x的值即为最大公约数。
2.更相减损法(辗转相减法)
利用较大数减较小数,得到的差值赋值给较大数,每进行一次循环都要进行一次判断,确保每次都是较大数被赋值差值,循环计算,当差值为0时,结束循环,此时的减数和被减数相等,均为最大公约数。
代码实现:
#include <stdio.h>
//更相减损法
int gcd(int x, int y)
{
while (x != y)//即两数的差值不为0
{
if (x > y)
{
x = x - y;
}
else
{
y = y - x;
}
}//当两数的差值为0时结束循环
return x;//同于return y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int n = gcd(a, b);
printf("%d\n", n);
return 0;
}
解释:
更相减损法是减法和循环的结合,具体原理在代码块上方。
3.穷举法
将两数较小值得出来,利用循环从1到该较小值,遍历找出最大的公因子,即两数的最大公约数数。
代码实现:
#include <stdio.h>
//穷举法
int gcd(int x, int y)
{
int i = 1;
int c = 1;
int n = x > y ? y : x;//求两数的较小值
for (i = 1;i <= n;i++)
{
if (x % i == 0 && y % i == 0)//求两数的公约数
{
c = i;
}
}
return c;//该数为两数的最大公约数
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int n = gcd(a, b);
printf("%d\n", n);
return 0;
}
解释:
穷举,一一列举。在1到两数较小值中逐一寻找,只要找到便赋值给上述代码中的c,最后一个赋值的i定是两数的最大公约数。
二、最小公倍数
1.利用最大公约数求最小公倍数
原理:最大公约数 * 最小公倍数 = x * y
方法:先求得最大公约数,再将两数乘积除以最大公约数,得到的即为两数的最小公倍数。
代码实现(代码中利用辗转相除法求最大公约数):
#include <stdio.h>
//辗转相除法求最大公约数
int gcd(int x, int y)
{
int c = 1;
while (c > 0)
{
c = x % y;
x = y;
y = c;
}
return x;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int n = gcd(a, b);//n为a和b的最大公约数
printf("%d\n", n);
//求a和b的最小公倍数
int min = a * b / n;//min即为a和b的最小公倍数
printf("%d\n", min);
return 0;
}
2.利用其中一个数的倍数求最小公倍数
原理:公倍数的意思就是指两个数共同的倍数,所以任选一个数,从它的倍数里从小到大挑选第二个数的倍数,最小的那个就是它们的最小公倍数。
代码实现:
//求最小公倍数
//从小到大从一个数的倍数里挑选第二个数的倍数,第一个(最小的那个)就是它们的最小公个倍数
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int i = 1;
while (1)
{
if (a * i % b == 0)
{
break;
}
i++;
}
printf("%d\n", a * i);//a*i即为a和b的最小公倍数
return 0;
}
3.穷举法
原理:从两数的较大值开始,每次加1,寻找两数共同的倍数,第一个即是最小公倍数。
代码实现:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int ret = a > b ? a : b;//取两数的较大数
while (1)
{
if (ret % a == 0 && ret % b == 0)
{
break;
}
ret++;
}
printf("%d\n", ret);//两数的最小公倍数
return 0;
}
结语:
求解两数的最大公约数和最小公倍数是常遇的问题,虽然不是什么难题,但重要的是要自己动手,不要过于轻视。只有学会并解决遇到的每一个小问题,才能积攒出解决难题的能量,让我们一起努力吧!