【题目来源】
https://www.luogu.com.cn/problem/B3634
【题目描述】
给定两个正整数 a,b,求他们的最大公约数(gcd)和最小公倍数(lcm)。这两个整数 a,b 均在 int 范围内。
【输入格式】
两个整数 a 和 b,用空格分隔。
【输出格式】
两个整数表示答案,用空格隔开。
【输入样例】
6 15
【输出样例】
3 30
【数据范围】
整数 a,b 均在 int 范围内。
【算法分析】
● 因为 a/gcd(a,b)*b 有可能爆 int,所以需强制转换为 long long 型。
● 更相减损法,是一种求两个正整数最大公约数的算法,它出自中国古代数学著作《九章算术》。更相减损法的基本原理是通过反复用较大的数减去较小的数,直到两数相等为止,此时的数即为两数的最大公约数。更相减损法原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
【算法代码】
cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int gcd(int a,int b) {
if(a==b) return a;
else if(a>b) return gcd(a-b,b);
else return gcd(a,b-a);
}
int main() {
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<" "<<(LL)a/gcd(a,b)*b;
return 0;
}
/*
in:6 15
out:3 30
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/161171641
https://www.luogu.com.cn/problem/solution/B3634
https://blog.csdn.net/hnjzsyjyj/article/details/145671149