输入第一行输入一个整数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
这道题是一个很经典的算法案例,辗转相除法,更相减损术都可以实现,但是在这里辗转相除法就显得更加的高效率。下面贴上代码,
#include<stdio.h>
int gcd(int a,int b)//定义一个辗转相除的方法
{
return b==0?a:gcd(b,a%b);
}
int main(){
int a,b,n;
scanf("%d",&n);
while(n--){
scanf("%d %d",&a,&b);
int GCD=gcd(a,b);
printf("%d %d\n",GCD,(a*b)/GCD); //最小公倍数可以由两数之积除以他们的最大公约数得出
}
return 0;
}
这里是另一种的做法,更相减损术这种算法相对其他的一些基本方法来说已经是一步很大的进步了,
#include<stdio.h>
int main(){
int a,b,t,n;
int x,y;
scanf("%d",&n);
while(n--){
scanf("%d %d",&a,&b);
x=a,y=b;
while(x!=y){
if(x<y) //清楚算法思想什么是更相减损术。
t=x,x=y,y=t;
x-=y;
}
printf("%d %d\n",x,(a*b)/x);
}
return 0;
}