题目描述
输入两个正整数m和n,输出它们的最大公约数和最小公倍数。
输入
两个正整数m和n,0<m,n<100。
输出
它们的最大公约数和最小公倍数,中间用空格分隔。
样例输入
12 18
样例输出
6 36
提示
可以使用穷举法、求差判定法或辗转相除法
(本文仅选择更为简单的辗转相除法做解答,并非为最简代码,希望评论区各位大佬可以提供更为简单的解法)
辗转相除法原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
例如:
252和105的最大公约数:21
gcd(252,105)
=gcd(105,42)
=gcd(42,105%42)
=gcd(42,21)
=gcd(21,42%21)
=gcd(21,0)
最大公约数gcd(a,b):
gcd(a,b)=gcd(b,a%b)
...
gcd(a,0)=a
最小公倍数lcm(a,b):
gcd(a,b)*lcm(a,b)=a*b
故lcm(a,b)=a/gcd(a,b)*b
本题代码
#include <stdio.h>
int gcd(a,b)
{
int c;
if (a < b)
{
c = a;
a = b;
b = c;
}
int r;
while ((r = a % b) != 0)
{
a = b;
b = r;
}
return b;
}
int main()
{
int a, b, d, lcm;
scanf("%d %d", &a, &b);
d = gcd(a, b);
lcm = a / gcd(a, b) * b;
printf("%d %d", d,lcm);
return 0;
}
本人仅为大一学生,且是在初入ACM时分享此代码与解析,如有错误,欢迎指正