1.题目
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
2.最大公约数和最小公倍数
1.最小公倍数:任何两个整数的最小公倍数等于这两个数之积再除以这两个数的最大公约数。
2.最大公约数:使用连除取余法,即大数除以小数再取余数,如果余数不等于0,则除数变被除数,余数变除数,继续相除并取余,直到除数为0,此时除数为最大公约数。
3.代码
3.1第一种方法(简单粗暴)
#include <stdio.h>
int main()
{
int m, n, t, v;
int max, min;
scanf("%d %d", &m, &n);
int M = m;
int N = n;
if (n > m)
{
t = n; n = m; m = t;
}
while (1)
{
v = m % n;//只能让大的数除以小的数
if (v)
{
m = n;
n = v;
}
else
{
break;
}
}
max = n;
min = M * N / max;//注意m,n在前面的过程中改变的,所以需要用其他的变量存着m,n的原始值
printf("%d %d", max, min);
return 0;
}
3.2第二种方法(调用函数)
#include <stdio.h>
int fun1(int u, int v)
{
int t, r;
if (v > u)
{
t = u; u = v; v = t;
}
while ((r = u % v) != 0)//用这种将过程语句当做判断条件的循环更简洁
{
u = v; v = r;
}
return v;
}
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int max = fun1(m, n);
int min = m * n / max;
printf("%d %d", max, min);
return 0;
}