输入两个正整数m和n,求其最大公约数和最小公倍数。
编程提示:求两个正整数的最大公约数和最小公倍数采用的是欧几里得算法,也就是我们常说的辗转相除法。该算法如下:
(1) 对于已知两数m,n,使得m>n
(2) m除以n得余数r
(3) 若r=0,则n为最大公约数,结束;否则执行(4)
(4) m←n,n←r,再重复执行(2)
输入格式:
输入两个正整数m n,中间用一个空格分隔。
输出格式:
输出最大公约数与最小公倍数,用一个空格分隔。
输入样例:
在这里给出一组输入。例如:
9 15
输出样例:
在这里给出相应的输出。例如:
3 45
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include <stdio.h>
int main() {
int m, n; // 两个输入的数
int x = 1, y; // x 是最大公约数,y是最小公倍数
int i = 2; // 累乘因子,从 2 开始
scanf("%d%d", &m, &n);
if (m < n) {
m = m + n;
n = m - n; // m(m + n) - n(n) = m
m = m - n; // m(m + n) - n(m) = n
}
if (m % n == 0)
{
printf("%d\f %d\f",n,m);
}
else
{
while (i < n)
{
if (m % i == 0 && n % i == 0)
{
m /= i;
n /= i;
x *= i;
}
else
{
i++;
}
}
y = x * m * n;
printf("%d %d", x,y);
}
}