题目描述
输入两个正整数,输出其最大公约数和最小公倍数。
输入
输入两个正整数n和m(n,m<=1000000)。输入保证最终结果在int范围内。
输出
输出两个整数,用空格隔开。表示m和n的最大公约数和最小公倍数。
样例输入
4 6
样例输出
2 12
此题和1062:求最大公约数多了一个求最小公倍数,因此我们可以在1062代码的基础上改动,添加输出最小公倍数
计算m和n的最大公约数和最小公倍数时:最小公倍数=两数乘积/最大公约数
本题也需考虑数据溢出,当两数在int范围,两数的乘积不一定在int范围,因此我们先除后乘,保证数据都在int范围,不会溢出
代码如下
#include<stdio.h>
int main()
{
int m,n,r;//定义余数r
int min,M,N;//这里定义的均为暂存值
scanf("%d %d",&m,&n);
M = m;N = n;
if(n>m)//n大于m时,n和m进行交换
{
min = m;
m = n;
n = min;
}
r = m%n;//求余数
while(r!=0)//余数不等于0时
{
m = n;
n = r;
r = m%n;
}
printf("%d %d",n,M/n*N);//输出最大公约数和最小公倍数,先除后乘,不会溢出
return 0;
}