求最大公约数和最小公倍数的几种算法

简介: 求最大公约数和最小公倍数的几种算法

对于求解这两道道例题有很多种不同的解法,比如辗转相除法,穷举法,等等,这次简单介绍一下。


最大公约数


1.辗转相除法


辗转相除法, 又名欧几里德算法(Euclidean algorithm。 它的具体做法是:用较小数除较大数,再用出现的余数(第一个余数)去除除数,再用出现的余数(第二个余数)去除第一个余数,如此反复,直到最后余数是0为止。


代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int eual(int a, int b) {
  int t;
  while (b != 0) {
    t = a % b;
    a = b;
    b = t;
  }
  return a;
}
int main() {
  int a, b;
  scanf("%d%d", &a, &b);
  printf("eual=%d\n", eual(a, b));
  return 0;
}

2.穷举法


由于a和b的最大公约数不可能比a和b中的较小者还大,否则一定不能整除它,因此,先找到a和b中的较小者min,然后从min开始逐次减1尝试每种可能,即检验min到1之间的所有整数,第一个满足公约条件的min,就是a和b的最大公约数。

代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int a, b, min;
    scanf("%d %d", &a, &b);
    min = a < b ? a : b;
    while (!(a % min == 0 && b % min == 0))
    {
        min--;
    }
    printf("%d", min);
    return 0;
}


求最小公倍数


1.穷举法


m和n的最小公倍数一定比m和n大,也就是说要>= m,n的较大值

找到这个最大值,并且不断的++,总能找到一个值能够同时整除m和n

代码如下


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int m, n, k;
    scanf("%d %d", &m, &n);
    k = m > n ? m : n;
    for (k;; k++)
    {
        if (k % m == 0 && k % n == 0)
            break;
    }
    printf("%d", k);
    return 0;
}

2.改良版的穷举法


代码如下:


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int m, n;
    scanf("%d %d", &m, &n);
    int i=1;
    while(m*i % n !=0)
    {
        i++
    }
    printf("%d", m*i);
    return 0;
}


相关文章
|
3月前
|
算法
求最大公约数和最小公倍数的算法
求最大公约数和最小公倍数的算法
25 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
17 0
|
3月前
|
算法 Python
最大公约数算法
最大公约数算法
|
3月前
|
算法 Python
最小公倍数算法
最小公倍数算法
|
10月前
|
算法
算法训练之最大最小公倍数 ALGO002
算法训练之最大最小公倍数 ALGO002
29 0
|
10月前
|
算法 Python
转:最大公约数算法很无聊吗?一个轻松方法(辗转相除法)3行代码搞定
最大公约数算法不是很无聊,计算最大公约数是数学中一个重要的概念,可以用于判断两个数是否互质、求分数的约分等,在很多领域都有广泛的应用。辗转相除法3行代码搞定。
48 0
|
11月前
|
算法 C++
每日算法系列【LeetCode 1363】形成三的最大倍数
每日算法系列【LeetCode 1363】形成三的最大倍数
算法--递归辗转相除法求最大公约数
算法--递归辗转相除法求最大公约数
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真