题目描述
给定两个正整数 a,b,求他们的最大公约数(gcd)和最小公倍数(lcm)。这两个整数均在 int 范围内。
输入格式
两个整数 a 和 b,用空格分隔。
输出格式
两个整数表示答案,用空格隔开。
输入输出样例
输入 #1
6 15输出 #1
3 30
题目难度
普及-
参考思路
给定正整数a,b,输出gcd(a,b) 和 lcm(a,b)。
先来看怎么求 gcd(a,b)。
公约数:若 q 为一个数,∀q∈Z+ 且 amodq=0,bmodq=0,则我们称 q 为a,b 的公约数。
最大公约数:能被 a,b 同时整除的最大正整数。
辗转相除法,即欧几里得算法,可以解决最大公约数的问题。
公式为 gcd(x,y)=gcd(y,xmody) (x>y,xmody≠0)
如何证明呢?
参考代码
#include<iostream>
using namespace std;
int main()
{
long long a,b,c,e,d,r;
cin>>a>>b;
e=a;
d=b;
if(a<b){
c=a;
a=b;
b=c;
}
r=a%b;
while(r){
a=b;
b=r;
r=a%b;
}
cout<<b<<" ";
cout<<e*d/b;
return 0;
}