【基础练习】欧几里得
小乐乐与欧几里得
http://www.nowcoder.com/questionTerminal/da13e0cf321e4df9acd0fdf0a433cbb0
题目描述
小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
输入描述:
每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)
输出描述:
对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。
解题思路
求出最大公约数和最小公倍数相加,通过碾转相除法求最小公倍数。
代码
#include<iostream>
using namespace std;
int gcd(int x,int y)//通过碾转相除法求最小公倍数
{
while(x!=y)
{
if(x>y) x=x-y;
else
y=y-x;
}
return x;
//辗转相除法
}
int main()
{
unsigned long long int a, b, g, m; //g为最大公约数m为最小公倍数
cin >> a >> b;
unsigned long long int a1 = a, b1 = b, temp = 1;
while (temp)//temp不为0的话
{
temp = a1 % b1;
a1 = b1;
b1 = temp;
}
g = a1;//最大公约数
m = a * b / g;//最小公倍数
cout << g + m << endl;
return 0;
}