解题—求两数的最大公约数与最小公倍数 #辗转相除法

【算法学习】最小公倍数问题 公式推导。处理零的情况如果任一数为零,直接返回 0(因为零和任何数的 LCM 是零)。防止整数溢出将a * b转换为long long类型,避免乘法溢出(例如a = 1e9b = 1e9处理负数使用std::abs保证计算的数值为正,避免符号干扰。2,辗转相减法若a>b,则a=a-b(大的数减去小的数)若a=b,则a或b就是最大公约数如求35和14的两个最小公倍数:35-14=21;21-14=7;此时7小于14,要做一次交换14-7=7;7-7=0; 阅读详情
AI摘要

本文介绍了求解两个整数的最大公约数和最小公倍数的两种方法:硬解法和辗转相除法。详细解释了辗转相除法(欧几里得算法)的图形理解与公式理解,并给出了相应的C语言实现。

文章目录

前言

一、最大公约数

方法一:硬解

方法二:辗转相除法

1、图形理解:

 2、公式理解:

二、最小公倍数

方法一:硬解

方法二:巧解

总结


前言

路漫漫其修远兮,吾将上下而求索。


一、最大公约数

假设输入的两个值为m 与 n ;

方法一:硬解

总所周知,最大公约数一定小于等于输入两个值中的最小值;

倘若 n > m ,那么这两个数的最大公约数一定小于等于 n  ; 而最大公约数同时满足被 n 与 m 整除;

故而其代码如下:

#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	while (scanf("%d %d", &n, &m)!= EOF)
	{
		int max = n > m ? n : m;
		int min = n < m ? n : m;
		//最大公约数
		int gcd = min;
		while (1)
		{
			if (n % gcd == 0 && m % gcd == 0)
				break;

			gcd--;
		}
		printf("%d\n", gcd);
	}
	return 0;
}

方法二:辗转相除法

辗转相除法又称为欧几里得算法,用于计算两个非负整数m,n的最大公约数。

1、图形理解:

例如:需求 624 与 1404 的最大公约数;如下图所示:

将数据 624 与 1404 转换成一个矩形而要被一个最大的正方形填充;

在上图中可以清楚地发现,将短边在长边中组成正方形,不看正方形部分于是乎就又形成了一个新的长方形,又在这个新长方形中用短边组成长方形来填充……直到所有面积均被划分地正方形填充,那么此正方形便是填充这个长方形的最大正方形;(看下图可能会明显一点)

转换成数学语言就是将余数除以被除数(余数一定小于被除数)得到的余数再除以上一个式子的被除数;

体现在上图中就是不停地在长边中划分短边的正方形……一直重复直到长边完全被短边划分;那么此时的短边正方形便是填充原矩形的最大正方形;

那么体现成数学公式便为:

 2、公式理解:

默认 a,b 为整数,而求a ,b 的最大公约数;

(a,b)-->求 a,b 的最大公约数(a,b)

本质原理:a/b=q…r

如果有两个整数a,b 便会存在唯一的一个整数q和r,满足式子 a/b=q...r

经过上面图形的启发,我们可得知:(a,b)=(b,r)

如何验证这个公式呢?
由a/b=q…r,可得a=b*q+r;以及r=a-b*q;

  • 假设(a,b) = d1; 则可以得到 a= d1*m,b=d1*n,其中(n,m)=1,即m与n 互质;存在n与m均属于整数那么可知:r=d1*m -di*n*q= d1(m-ng);

  • 假设 (b,r) =d2;则可以得到 b=d2*m,r=d2*n,其中(m,n)=1,存在n与m均属于整数;那么可知:a=d2*m*q+d2*n= d2*(m*q+n)


而又存在(a , b, c, d)=((a,b),c, d);所以(a, b,r )=((a,b),r)=( a,(b,r));

  • ((a,b),r)=(d1,r)=(d1,d1(m-ng))=d1;因为m,n,g必为整数,所以 m-ng 必为整数,故而其最大公约数为d1;
  • (a,(b,r))=(a,d2)=(d2*(m*g+n),d2)= d2 ;

然而a br这三个整数只存在唯一的最大公约数,故而 d1=d2;

即(a,b)=(b,r)得以验证

即存在:

代码如下:

//辗转相除法
#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	int gcd = 0;
	while (scanf("%d %d", &m, &n) != EOF)//多组输入
	{
		while (m%n)//
		{
			int c = m % n;
			m = n;//被除数当作除数
			n = c;//余数当作被除数
		}
		//当循环停止时,即计算下去无余数时此时的被除数便为最大公约数
		gcd = n;

		printf("最大公约数为%d\n", gcd);

	}

	return 0;
}

代码运行结果如下:

二、最小公倍数

假设输入的两个值为m 与 n ;

方法一:硬解

可知,最小公倍数的一定小于等于两数之积而大于等于两数中的较大值;

代码如下:

//最大公倍数
#include<stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	while (scanf("%d %d", &m, &n) != EOF)
	{
		int lcm = n > m ? n : m;
		while (1)
		{
			if (lcm % n == 0 && lcm % m == 0)
				break;
			lcm++;
		}
		printf("最小公倍数为:%d\n", lcm);
	}

	return 0;
}

代码运行结果如下:

方法二:巧解

在得知最大公约数的情况下满足 : m*n = 最大公约数*最小公倍数;

为什么呢?

如下图:

假设 m = 76x , n = 27x ;那么可知 m*b = 76* x * 27 *x;

而最小公约数为 x ,最大公倍数为 76*27*x; --> 所以得知 m*n = 最大公约数*最小公倍数;

代码如下:

#include<stdio.h>

int main()
{
	int n = 0;
	int m = 0;
	int gcd = 0;
	int lcm = 0;
	while (scanf("%d %d", &m, &n) != EOF)
	{
		//最大公约数
		int i = m;//保护 m,n
		int j = n;
		while (i % j)
		{
			int ret = i % j;
			i = j;
			j = ret;
		}
		gcd = j;
		//最小公倍数
		lcm = (n / gcd) * (m / gcd) * gcd;

		printf("最小公倍数为:%d", lcm);
	}
	return 0;
}

代码运行结果如下:


总结

假设需求m,n 的最大公约数与最小公倍数;

最大公约数:硬解;辗转相除法

最小公倍数:硬解;巧解(辗转相除法+原理:m*n = 最大公约数*最小公倍数)

辗转相除法求最小公约数和最大公倍数 辗转相除法求两个数的最大公约数 今天看了一个题,就是求两个数的最大公约数和最小公倍数。觉得挺有意思的就自己整了整。 这个题有一种简单易懂的算法,就是先选出两个数较小的那个数,然后较大的数对较小的数取余,并判断余数是否为零,如果不为零则较小的这个数自减,然后较大的数再对其取余知道余数为零为止。当余数为零时较小的数现在就是最小公约数。最小公倍数的求法就比较简单了:两者的积除以最大公约数就是最小公倍数,... 阅读详情

相关推荐

Python求最大公约数和最小公倍数

大家好,我是Python领域的博主,如果觉得我的写的不错的话, 请点赞关注支持我一下。如果你是初学者,可以和小编一起学习,在这里我每天都会发Python的基础知识,以及相关的代码 解题思路: 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个;最小公倍数是指两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。最小公倍数=两整数的乘积÷最大公约数 , 所以怎么求最大公约数是关键。 求最大公约数: 辗转相除法是求最大公.

qq_46857088的博客 2万+

详解“辗转相除法”(如何求最大公约数)

辗转相除法是用于求两个非负整数的最大公约数的高效方法这种方法可以不用去计算两个数谁大谁小,这样能够提高运算效率具体还是看我上面的手绘图加深一下理解。

C_Small_Cai的博客 1万+

(C++)用辗转相除法求最大公约数和最小公倍数

用辗转相除法求最大公约数和最小公倍数 介绍 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。 算法简介 欧几里德算法是用来求两个正整数最大公约数的算法。是由古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。 扩展欧几里德算法可...

weixin_45789744的博客 2386

【算法】辗转相除法求最大公约数

辗转相除法,又称欧几里德算法(Euclidean Algorithm),是求两个数的最大公约数(greatestcommondivisor)的一种方法。用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。

Qiuhan_909的博客 6万+

辗转相除法求最大公约数和最小公倍数详解

本文介绍了求最大公约数的辗转相除法(欧几里德算法)。算法基于gcd(a,b)=gcd(b,a mod b)原理,通过循环取余运算求解。文章详细说明了算法步骤、C语言实现代码,并分析了其O(log(min(a,b)))的时间复杂度。同时介绍了利用最大公约数求最小公倍数的方法,给出了具体示例演示。该算法具有高效、简洁的特点,适用于大数运算,在密码学等领域有广泛应用。

学无止境 3936

手把手教你在全新服务器内网安装OpenEuler 22.03 LTS SP4+ 安装 openGuass 5.0.0(LTS) 数据库

openEuler是面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的开源服务器Linux操作系统。

cgqyw的专栏 3738

求两数最大公约数和最小公倍数(详解)

求两数最大公约数和最小公倍数 方法一:单独求解最小公倍数 若大数m是小数n的倍数,则大数m为所求的最小公倍数;若不是,另寻找一个能同时被两个整数的自然数。找到第一个后,break终止循环。 终止条件: 1.可把判定条件表示成循环变量满足的基本条件,如本例终止条件表示成i>0. 2.终止条件省略不写,利用循环体中的语句结束循环,如在找到第一个满足条件的自然数利用break语句结束循环。 3.代...

weixin_45422321的博客 7157

TPRI-DMP平台介绍

TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台,已经过13年的发展和迭代,其具备大规模能源电力行业生产应用软件开发和运行能力

ashou706的专栏 2276

Python中用辗转相除法求两个整数的最大公约数和最小公倍数

Python中用辗转相除法求两个整数的最大公约数和最小公倍数 首先,得到两个已知的正整数m、n,使得m > n(这里可以通过if语句判断m、n的大小,然后用三条语句使得m > n)例如: if m < n: t = n n = m m = t 通过m 除以 n 得余数 r。然后判断余数r是否为0; 若r 不等于 0,则令m = n, n = r, 然后继续相除,直到余数r = 0 为止,此时得到的 m 就是最大公约数。 得到最大公约数后,最小公倍数就是已知的两个正

qq_43618698的博客 2万+

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 669

同花顺客户端数据采集:Hook注入与内存解密实战

在金融量化领域,客户端数据采集是获取低延迟、高精度行情的关键技术路径。其底层涉及进程通信、内存加密、反调试等典型Windows逆向工程问题。理解API Hook原理与AES-CBC动态密钥派生机制,有助于突破传统HTTP爬虫在国产金融软件中的失效困境。该技术不依赖网络劫持,而聚焦于本地进程内函数拦截与运行时内存解析,具备离线、可控、合规等工程优势,广泛应用于Level2行情、逐笔委托、分笔成交等高频数据场景,是量化基础设施中‘端侧数据主权’的重要实现方式。

weixin_30496999的博客 856

Python求最小公倍数与最大公约数(附代码与解题思路)

文章介绍了Python求最小公倍数与最大公约数的几种方法,包括常规方法以及内置方法。包含代码和解题思路。

qq_36507046的博客 7649

YOLOv8知识蒸馏实战:用BCKD和LD在自制数据集上分别提点1.63%和1.69%的保姆级教程

本文详细介绍了在YOLOv8模型上应用知识蒸馏技术(BCKD和LD方法)的实战教程,通过自制数据集实现性能提升1.63%和1.69%。内容涵盖环境配置、模型选择、BCKD和LD的具体实现及调参技巧,适合目标检测领域的开发者和研究者。

weixin_29082143的博客 245

辗转相除法,辗转相减法,枚举法实现最大公约数的计算 && 求最小公倍数

题目:最大公约数和最小公倍数计算。 从键盘接收两个整数,编写程序求出这两个整数的最大公约数和最小公倍数 (提示:求最大公约数可用辗转相除法,求最小公倍数的积除以最大公约数即可)。 这里分别列举辗转相除法,辗转相减法,枚举法三种方法来求最大公约数。 而最小公倍数 = 两个整数的乘积 / 最大公约数。 gcd函数代表求最大公约数,lcm代表求最小公倍数。 1、辗转相除法 ...

烟敛寒林的博客 1万+

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

【25届数字IC秋招总结】面试经验10——紫光同芯

25届数字ic面试记录——紫光同芯

lalala0635的博客 862

Python求两个或三个正整数的最大公约数和最小公倍数

题目:求两个正整数的最大公约数和最小公倍数。 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。 提高要求: 1.三种以上算法解决两个正整数最大公约数问题。 2.求3个正整数的最大公约数和最小公倍数。 源代码如下: # 辗转相除法求最大公约数 # # a = int(input("请输入a的值:")) # b = int(input(...

EricKillers的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最大公约数和最小公倍数问题

最小公倍数 = 两个数的乘积 / 最大公约数。先弄明白求最小公倍数和最大公约数的公式。一行一个数,表示求出满足条件的。NOIP 2001 普及组第二题。试求:满足条件的所有可能的。最大公约数可以使用辗转相除法。,求出满足下列条件的。

qq_58616979的博客 1841

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

100个python算法超详细讲解:最小公倍数

1.问题描述 求任意两个正整数的最小公倍数(Least Common Multiple, LCM)。 2.问题分析 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约 数,对于两个整数来说,最小公倍数是指这两个数共有倍数中最小的 一个。计算最小公倍数时,通常会借助最大公约数来辅助计算,即最 小公倍数=两数的乘积/最大公约(因)数,解题时要避免和最大公约 (因)数问题混淆。 对于最小公倍数的求解,除了利用最大公约数外还可根据定义进 行算法设计。要求任意两个正整数的最小公倍数,就是求出一个最小 的

Lee达森的博客 7603

c语言求最小公约数和最小公倍数,c语言求最大公约数和最小公倍数

求最大公约数和最小公倍数假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数。最小公倍数的公式是 a*b/mm为最大公约数因为 a=m*i; b=m*j;最小公倍数为 m*i*j计算a和b的最大公约数的方法:方法一:更相损减法:反复把两数的最大者减去最小者,直至两数相等,这个数就是最大公约数如 4 和 66-4=22个数变成了4和...

weixin_34274601的博客 1万+

用Python求两数的最小公倍数-辗转相除法

问题:输入正整数A,B,求得A,B的最小公倍数 思路一:暴力迭代循环,直到循环至某数能被A,B整除。方法简单,但是效率太低。 a=int(input()) b=int(input()) m=max(a,b) n=min(a,b) if m%n==0: min_mul=a else: min_mul=a+b while min_mul%m!=0 or min_mul%n!=0: min_mul+=1 print(min_mul) 思路二:最小公倍数=两数之积/最大公约

爱吃干脆面的小潘 4159

Python 求两个正整数的最大公约数和最小公倍数

# 最大公约数 # 辗转相除法(递归) def gcd(a: int, b: int): if b == 0: return a else: return gcd(b, a % b) # 最小公倍数(以最大公约数的结果为基础) def lcm(a: int, b: int): return int((a * b) / gcd(a, b)) print(lcm(25, 15)) print(gcd(25, 15)) ...

Looking的网页备忘录和个人知识库 1万+

python求最大公约数和最小公倍数的两种方法

最大公约数和最小公倍数的求解可以归结为求最大公约数,最小公倍数为两数乘积除以最大公倍数 这里介绍两种求解方法,一种数常规易于理解的,一种是用辗转相除法实现的 # 求最大公倍数和最小公约数 a=int(input("输入一个数字")) b=int(input("再输入一个数字")) m=[] if a>b: smaller=b else: smaller=a for i ...

qq_41725214的博客 5万+

Python 最大公约数 最小公倍数

基础概念: a / b = c ......0 ,则a是b的倍数,b是a的因数(又称“约数”)。 公倍数:两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。 整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号。 公约数:亦称“公因数”。它是一个能被若干个整数同时均整除的...

缘来如此 2224

python求n数的最大公约数,最小公倍数

第二次上课 一、 题目: 基本要求: 求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。 提高要求: 一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足: 1、 x和a0的最大公约数是a1; 2、 x和b0的最小公倍数是b1。 输入格式 输入第一行为一个正整数n,表示有n组输入数...

qq_43911136的博客 1万+
上一篇: 内存库函数的使用与其模拟实现 #memcpy #memmove #memcmp #menset
下一篇: C语言 自定义类型-结构体 #结构体类型的声明 #结构体的自引用 #结构体内存对齐 #结构体位段的实现
秦少游在淮海
博客等级 码龄3年 1071粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值