题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=40
描述
小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。
输入
第一行输入一个整数n(0<n≤10000),表示有n组测试数据;
随后的n行输入两个整数i,j(0<i,j≤32767)。
输出
输出每组测试数据的最大公约数和最小公倍数
样例输入
3 6 6 12 11 33 22 |
样例输出
6 6 1 132 11 66 |
算法思想:
欧几里得辗转相除法,输入a,b,设a≥b,ans = a mod b;a = b;b = ans;直至ans为0, 此时b就为a与b的最大公约数,(a * b)/最大公约数 即为最小公倍数。
源代码
#include <iostream>
#include <algorithm>
using namespace std;
//求最大公约数函数
int getMax(int x, int y)
{
int ans = 1, a, b;
a = max(x, y);
b = min(x, y);
x = a;
y = b;
while (ans)
{
ans = x % y;
x = y;
y = ans;
}
return x;
}
int main()
{
int n, i, j, ans;
cin >> n;
while (n--)
{
cin >> i >> j;
ans = getMax(i, j);
cout << ans << " " << (i * j) / ans << endl;
}
return 0;
}
最优源代码
#include<stdio.h>
int main()
{
unsigned int u,v,r,s,i,d;
scanf("%u",&s);
for(i=1;i<=s;i++)
{
scanf("%u%u",&u,&v);
d=u*v;
while(v!=0)
{
r=u%v;
u=v;
v=r;
}
printf("%u %u\n",u,d/u);
}
return 0;
}