最大公约数和最小公倍数,你知道有几种求法吗?
文章目录
- 最大公约数
- 求法一:暴力求解
- 求法二:更相减损法
- 求法三:辗转相除法
- 求法四:递归写法
- 最小公倍数
- 求法一:暴力求解
- 求法二:公式法
- 总结
最大公约数
什么是最大公约数呢?定义如下:
如果数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)辗转相除法 两整数i和j: ① i%j得k ② 若k=0,则j即为两数的最大公约数 ③ 若k≠0,则i=j ...
- python最大公约数和最小公倍数的求法_最大公约数和最小公倍数的求法分析
简介 求最大公约数和最小公倍数可能是编程中最常见的几个基本问题了.因为他们的基本概念基本上很早的时候就知道了,对他们的求法和他们之间的关系都比较有意思. 基本的数学性质 先从最大公约数这一部分开始吧. ...
- Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
ylbtech-Arithmetic:Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数 1.A,Demo(案例) 输入两个正整数m和n,求其最大公约数和最小 ...
- 【算法总结】数学问题-最大公约数和最小公倍数
[算法总结]最大公约数和最小公倍数 一.最大公约数(GCD:greatest common divisor) 欧几里得算法: 若 a.b 全为零则它们的最大公约数不存在:若 a.b 其中之一为零,则它 ...
- ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...
- ACMNO.7 输入两个正整数m和n,求其最大公约数和最小公倍数。 输入 两个整数 输出 最大公约数,最小公倍数 样例输入 5 7 样例输出 1 35
题目描述 输入两个正整数m和n,求其最大公约数和最小公倍数. 输入 两个整数 输出 最大公约数,最小公倍数 样例输入 5 7 样例输出 1 35 来源/分类 C语言 示例照片: 设计思路: 本题最难的 ...
- C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)
题目来源:牛客网编程入门训练--BC115 小乐乐与欧几里得 输入描述: 每组输入包含两个正整数n和m.(1 ≤ n ≤ 109,1 ≤ m ≤ 109) 输出描述: 对于每组输入,输出一个正整数, ...
- 【题解】P1029 最大公约数和最小公倍数问题
目录 P1029 最大公约数和最小公倍数问题 方法一 方法二 P1029 最大公约数和最小公倍数问题 方法一 要知道最大公约数和最小公倍数的乘积就是原两个数的积. 换成公式就是: x∗y=gcd(x, ...
- 使用函数求两个整数的最大公约数和最小公倍数
<程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p240 习题7 3.编写两个函数,分别求两个整数的最大公约数和最小公倍数 #include<st ...
- c语言:输入两个正整数m和n,求其最大公约数和最小公倍数
输入两个正整数m和n,求其最大公约数和最小公倍数. 解:程序: #include <stdio.h> int main() { int num1, num2, t,p; printf(&q ...
最新文章
- php导出doc文件_PHP生成Word文档的方法
- 深度学习时代的图模型,清华发文综述图网络
- Redis数据库 安装
- docker运行redis:windows环境运行挂载目录的正确写法、-v挂载data目录、-v挂载redis.conf配置文件以及设置访问密码
- Boost:bimap双图的structured_pair的测试程序
- Directory /opt/jfrog/artifactory/var has bad permissions for user id 1030
- 在linux服务器搭建函数,linux ftp服务器搭建
- C#如何无客户端连接Oracle数据库
- matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现
- 手机写python爬虫_零基础开始写Python爬虫心得
- python缓存技术_高级Python技术:如何在Python应用程序中实现缓存
- IMX290 291驱动
- JAVA毕业设计婚纱摄影网设计计算机源码+lw文档+系统+调试部署+数据库
- truffle unbox react 初始化踩坑
- vue详细知识,语法和必备知识
- My Dream Life
- java基础之Object类_繁星漫天_新浪博客
- 【论文笔记】DSCN:基于深度孪生神经网络的光学航空图像变化检测模型
- php案例:$_SERVER详解(图文并茂)
- matlab 输出矩阵 逗号隔开,将逗号分隔的字段转换为matlab矩阵