扩展欧几里得算法(gcd和lcm)
gcd算法,即辗转相除法,用较大数除以较小数,得到第一余数,用第一余数去除以除数,再用出现的第二余数去除以第一余数,如此反复,直到最后余数是0为止,那个最后的除数就是最大公约数。最小公倍数即二者相乘除以最大公约数。求最大公约数的算法称为gcd算法,求最小公倍数的算法称为lcm算法。
#include<iostream>
#include<stdio.h>
using namespace std;
int gcd(int x, int y)
{
if(y==0)
return x;//若两数相余为0,说明两数存在倍数关系,最大公约数即为较小的那一个
else
return gcd(y, x%y);//扩展欧几里得算法,当a mod b=0,gcd(a,b)=b,否则,gcd(a,b)=gcd(b,a mod b),递归
}
int lcm(int x,int y)
{
if(x>y) return x*y/gcd(x,y);
else return x*y/gcd(y,x);//gcd算法前面的数需大于后面的数
}
int main()
{
int a, b, ans,anss;
cin >> a >> b;
if(a > b)
ans = gcd(a, b);
else
ans = gcd(b, a);
anss=lcm(a,b);
printf("%d\n",ans);//最大公约数
printf("%d\n",anss);//最小公倍数
return 0;
}