浙大版《C语言程序设计(第3版)》题目集 习题4-7 最大公约数和最小公倍数 (15分)

在这里插入图片描述

方法一:

普通做法

#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;
}
发布了165 篇原创文章 · 获赞 117 · 访问量 7803

猜你喜欢

转载自blog.csdn.net/qq_44458489/article/details/105320686