方法一:
普通做法
#include <stdio.h>
/*最大公约数:m除以这个数余0,n除以这个数也余0,且是公因子中最大的*/
int f1(int m, int n)
{
int i, min;
min = m > n ? n : m; //若m比n大,取n,否则取m.
for (i = min; i > 0; i--) //因为是寻找最大公因子所以用--
if (n % i == 0 && m % i == 0)
return i;
}
/*最小公倍数:这个数既是m的倍数,也是n的倍数,且是倍数中最小的*/
int f2(int m, int n)
{
int i, max, min, ret;
max = m > n ? m : n;
min = m > n ? n : m;
for (i = 1;; i++)
if (min * i % max == 0)
return min * i;
}
int main()
{
int M, N;
scanf("%d %d", &M, &N);
printf("%d %d", f1(M, N), f2(M, N));
return 0;
}
方法二:
辗转相除法:
- 找到较大数、较小数。
- 大数对小数求余。
- 小数赋给大数。
- 余数赋给小数。
/*辗转相除法*/
int f1(int m, int n)
{
int i, min, max, remainder, ret;
min = m > n ? n : m;
max = m > n ? m : n;
while (min)
{ //直到小数等于0,退出循环。
remainder = max % min; //大数对小数求余。
max = min; //小数赋给大数。
min = remainder; //余数赋给小数。
}
ret = max; //最大公约数。
return ret;
}
法一,法二结合,代码如下:
#include <stdio.h>
int main()
{
int M, N, max, min, i;
scanf("%d %d", &M, &N);
max = M > N ? M : N;
min = M > N ? N : M;
for (i = min; i > 0; i--)
if (max % i == 0 && min % i == 0)
{
printf("%d", i);
break;
}
for (i = 1;; i++)
if (min * i % max == 0)
{
printf(" %d", min * i);
break;
}
return 0;
}