文章目录

  • 最大公约数
    • 求法一:暴力求解
    • 求法二:更相减损法
    • 求法三:辗转相除法
    • 求法四:递归写法
  • 最小公倍数
    • 求法一:暴力求解
    • 求法二:公式法
  • 总结

最大公约数

什么是最大公约数呢?定义如下:
如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。
几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。

比如1:12、16的公约数有1、2、4,其中最大的一个是4,则4是12与16的最大公约数。
比如2:12、18的公约数有1、2、3、6,其中最大的一个是6,则6是12与18的最大公约数。
比如3:20、40的公约数有1、2、4、5、10、20,其中最大的一个是20,则20是20与40的最大公约数。

求法一:暴力求解

从上面举的例子我们可以分析,最大公约数一定不会大于两个数之间的最小数,最大也就是两个数的最小值,如20、40的最大公约数是20。

所以我们可以命令两个数的最小值为最大公约数,然后我们再用两个数分别除去这两个数的最小值,如果都能整除,则就是最大公约数,否则就自减1再用两个数分别除去,判断是否能整除,不能就自减1,一直循环下去直到找到都能被整除的数。(最坏的情况就是找到1停止)

比如上面的12、18这俩个数,这两个数的最小值是12,则定义变量tmp=12,然后判断12、18是否都能整除变量tmp。
tmp=12,不能被整除,自减1
tmp=11,不能被整除,自减1
tmp=10,不能被整除,自减1
tmp=9,不能被整除,自减1
tmp=8,不能被整除,自减1
········
tmp=6,都能被12、18整除
所以找到最大公约数了,12,18的最大公约数是6。
思路分析完毕,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int x = 0, y = 0;printf("请输入两个数字:");scanf("%d%d",&x,&y);int tmp = x < y ? x : y; //把两个数的最小值赋给tmpwhile (1){if (x % tmp == 0 && y % tmp == 0){break;  //找到最大公约数了,跳出四循环}tmp--;  //两个数都不能整除,自减1}printf("最大公约数是:%d", tmp);return 0;
}

程序运行结果:

求法二:更相减损法

通过上面的求解我们可以了解,是非常的暴力。万一两个数是质数呢?那不是一直减到1才找到吗?有一点复杂。
所以我们要了解更相减损法,定义如下:

更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。

思路分析:
以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到它们两个数相等为止。则相等的两个数就是所求的最大公约数。

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int x = 0, y = 0;printf("请输入两个数字:");scanf("%d%d",&x,&y);while (x != y)  //两个数不相等就一直循环{if (x > y){x = x - y;}else if (x < y){y = y - x;}}//到这里则是两个数相等,取其中的任何一个就是最大公约数printf("最大公约数是:%d\n", x);return 0;
}

程序运行结果:

求法三:辗转相除法

思路分析:
则相等的两个数就是所求的最大公约数。用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int x = 0, y = 0;int tmp = 0;printf("请输入两个数字:");scanf("%d%d",&x,&y);while ( y != 0){tmp = x % y;x = y;y = tmp;}printf("最大公约数是:%d\n", x);return 0;
}

求法四:递归写法

这个写法本质上也是更相减损法,只不够写法不同而已
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int Fun(int x, int y)
{if (x > y){return Fun(y, x - y);  //再开辟一个Fun函数}else if (x < y){return Fun(x, y - x);   //再开辟一个Fun函数}else   //找到相减到相等{return x;}
}
int main()
{int x = 0, y = 0;printf("请输入两个数字:");scanf("%d%d",&x,&y);int ret = Fun(x, y);printf("最大公约数是:%d\n", ret);return 0;
}

最小公倍数

什么是最小公倍数呢?定义如下:
几个数共有的倍数叫做这几个数的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。
举几个例子:
18、20的最小公倍数是180
12、18的最小公倍数是36
20、40的最小公倍数是40

求法一:暴力求解

通过上面举的例子我们可以发现 最小公倍数一定大于或等于两个数的最大值。

所以我们可以先找出两个数的最大值,然后赋值给变量tmp,然后用变量tmp分别除去两个数,如果能整除,则就是最小公倍数,否则变量tmp自加1,再分别除去两个数,判断是否能整除,一直循环下去,直到变量tmp都能够整除两个数。

比如12、18这两个数,这两个数的最大值是18,则定义变量tmp=18,然后判断变量tmp是否都能整除12、18。
tmp=18,不能整除12、18,自加1
tmp=19,不能整除12、18,自加1
tmp=20,不能整除12、18,自加1
tmp=21,不能整除12、18,自加1
tmp=22,不能整除12、18,自加1
········
tmp=36,都能整除12、18
所以找到最小公倍数了,12,18的最小公倍数是36。

代码实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int x = 0, y = 0;printf("请输入两个数字:");scanf("%d%d",&x,&y);int tmp = x > y ? x : y;  //把两个数的最大值赋给tmpwhile (1){if (tmp % x == 0 && tmp % y == 0){break;  //tmp都能整除两个数,找到最小公倍数了,跳出死循环}tmp++;   //不能整除,自加1}printf("最小公倍数是:%d\n",tmp);return 0;
}

程序运行如下:

求法二:公式法

公式法定义如下:
由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。
所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用两个数的积除去最大公约数得出它们的最小公倍数。
因此我们可以利用上面任何一种求最大公约数的方法来实现,先求最大公约数然后再求最小公倍数。
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Fun(int x, int y)
{if (x > y){return Fun(y, x - y);  //再开辟一个Fun函数}else if (x < y){return Fun(x, y - x);   //再开辟一个Fun函数}else   //找到相减到相等{return x;}
}
int main()
{int x = 0, y = 0;printf("请输入两个数字:");scanf("%d%d", &x, &y);int ret = Fun(x, y);printf("最大公约数是:%d\n", ret);printf("最小公倍数是:%d\n", x * y / ret);  //利用公式法,直接求出return 0;
}

程序运行结果:

总结

不管是求最大公约数还是最小公倍数,都用到了暴力求解法,是否发现很多相似的地方呢?
求最大公约数是把最小值赋给变量tmp,然后两个数再除去变量tmp判断是否能整除,不能整除变量tmp就自减1,直到整除为止。

求最小公倍数是把最大值赋给变量tmp,然后变量tmp再分别除去两个数判断是否能整除,不能整除变量tmp就自加1,直到整除为止。
这就是我关于最大公约数和最小公倍数的看法了,大家还有什么要补充和指正的可以在评论区探讨哦。

都看到这里了,点个赞呗,感谢感谢。

最大公约数和最小公倍数,你知道有几种求法吗?相关推荐

  1. 求两个整数的最大公约数和最小公倍数

    求两个整数的最大公约数和最小公倍数 给大家分享两种解法吧,话不多说,看下面. 第一种: (1)辗转相除法 两整数i和j: ① i%j得k ② 若k=0,则j即为两数的最大公约数 ③ 若k≠0,则i=j ...

  2. python最大公约数和最小公倍数的求法_最大公约数和最小公倍数的求法分析

    简介 求最大公约数和最小公倍数可能是编程中最常见的几个基本问题了.因为他们的基本概念基本上很早的时候就知道了,对他们的求法和他们之间的关系都比较有意思. 基本的数学性质 先从最大公约数这一部分开始吧. ...

  3. Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数

    ylbtech-Arithmetic:Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数 1.A,Demo(案例) 输入两个正整数m和n,求其最大公约数和最小 ...

  4. 【算法总结】数学问题-最大公约数和最小公倍数

    [算法总结]最大公约数和最小公倍数 一.最大公约数(GCD:greatest common divisor) 欧几里得算法: 若 a.b 全为零则它们的最大公约数不存在:若 a.b 其中之一为零,则它 ...

  5. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数

    题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...

  6. ACMNO.7 输入两个正整数m和n,求其最大公约数和最小公倍数。 输入 两个整数 输出 最大公约数,最小公倍数 样例输入 5 7 样例输出 1 35

    题目描述 输入两个正整数m和n,求其最大公约数和最小公倍数. 输入 两个整数 输出 最大公约数,最小公倍数 样例输入 5 7 样例输出 1 35 来源/分类 C语言 示例照片: 设计思路: 本题最难的 ...

  7. C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)

    题目来源:牛客网编程入门训练--BC115  小乐乐与欧几里得 输入描述: 每组输入包含两个正整数n和m.(1 ≤ n ≤ 109,1 ≤ m ≤ 109) 输出描述: 对于每组输入,输出一个正整数, ...

  8. 【题解】P1029 最大公约数和最小公倍数问题

    目录 P1029 最大公约数和最小公倍数问题 方法一 方法二 P1029 最大公约数和最小公倍数问题 方法一 要知道最大公约数和最小公倍数的乘积就是原两个数的积. 换成公式就是: x∗y=gcd(x, ...

  9. 使用函数求两个整数的最大公约数和最小公倍数

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p240 习题7 3.编写两个函数,分别求两个整数的最大公约数和最小公倍数 #include<st ...

  10. c语言:输入两个正整数m和n,求其最大公约数和最小公倍数

    输入两个正整数m和n,求其最大公约数和最小公倍数. 解:程序: #include <stdio.h> int main() { int num1, num2, t,p; printf(&q ...

最新文章

  1. php导出doc文件_PHP生成Word文档的方法
  2. 深度学习时代的图模型,清华发文综述图网络
  3. Redis数据库 安装
  4. docker运行redis:windows环境运行挂载目录的正确写法、-v挂载data目录、-v挂载redis.conf配置文件以及设置访问密码
  5. Boost:bimap双图的structured_pair的测试程序
  6. Directory /opt/jfrog/artifactory/var has bad permissions for user id 1030
  7. 在linux服务器搭建函数,linux ftp服务器搭建
  8. C#如何无客户端连接Oracle数据库
  9. matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现
  10. 手机写python爬虫_零基础开始写Python爬虫心得
  11. python缓存技术_高级Python技术:如何在Python应用程序中实现缓存
  12. IMX290 291驱动
  13. JAVA毕业设计婚纱摄影网设计计算机源码+lw文档+系统+调试部署+数据库
  14. truffle unbox react 初始化踩坑
  15. vue详细知识,语法和必备知识
  16. My Dream Life
  17. java基础之Object类_繁星漫天_新浪博客
  18. 【论文笔记】DSCN:基于深度孪生神经网络的光学航空图像变化检测模型
  19. php案例:$_SERVER详解(图文并茂)
  20. matlab 输出矩阵 逗号隔开,将逗号分隔的字段转换为matlab矩阵

热门文章

  1. Ubuntu更新-换源问题
  2. 工业CT分辨率——空间分辨率和密度分辨率
  3. SPRINGBOOT中如何进行开发环境和生产环境的配置?
  4. 操作系统(一)什么是操作系统
  5. 戒掉坏习惯—六种方法
  6. Radis 使用详细教程
  7. 人工智能软件怎么开发
  8. AI人工智能图片无损放大软件,这软件神了
  9. Android BMI程序设计
  10. Android 组件化方案 JIMU 体验