求最大公约数的几种常见的方法 【详解】

news2025/1/16 0:11:15

目录

一、关于公约数

二、计算最大公约数的方法 

1. 辗转相除法(欧几里得算法)

2. 更相减损法(辗转相减法)

3. 分解质因数法

4. 穷举法 

5. 递归法

6. 短除法

三、总结


一、关于公约数

首先 ,先介绍一下公约数:

公约数(公因数),一个能被若干个整数同时整除的的整数,公约数中最大的称为最大公约数。

公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,12和15的公约数有1,3,最大公约数就是3。再举个例子,30和40,它们的公约数有1,2,5,10,最大公约数是10。

计算两个数组的最大公约数,例如计算 a,b两个数的最大公约数。

二、计算最大公约数的方法 

1. 辗转相除法(欧几里得算法

第一步,先是两个数进行 模运算,来求余数   即 a%b

①当a可以被b整除时 (a%b == 0),直接返回 b , b就是最大公约数。例a = 4;b = 2;a%b==0,所以b = 2,就是这两个数的最大公约数。

②当a%b != 0时,则进行辗转交换,这里用第三个变量来接收 c = a%b; 用 a 来接收 b的值,用b来接收c(余数的值)。

例 a = 6,b = 12; c = a%b = 6;    a = b = 12;  b = c = 6;  a%b = 12%6 = 0。 最大公因数为 6。

共有约数中最大的一个

③重复上述①和② 

算法流程图

代码展示 

//求最大公约数  辗转相除法
#include <stdio.h>
int fun(int a,int b)
{
	while (a % b != 0)
	{
		int c = a % b;
		a = b;
		b = c;
	}
	return b;
}
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = fun(a,b);
	printf("最大公约数为:%d",ret);
	return 0;
}

示例:

2. 更相减损法(辗转相减法)

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

思想

原文是

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

翻译:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;

若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。

其中所说的“等数”,就是公约数。求“等数”的办法是“更相减损”法。

提取上述的一些思想

例 a = 12, b = 18;  b = b - a = 18 - 12 = 6; a >b; a = a - b = 12 - 6 = 6; a = b = 6; 。

算法流程图

代码展示 

//更相减损法(辗转相减法)
#include<stdio.h>
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	while (a != b) 
	{
		if (a > b)
			a = a - b;
		else
			b = b - a;
	}
	printf("最大公约数是:%d",a);
	return 0;
}

示例

3. 分解质因数法

 把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数

例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)= 12

代码展示

#include<stdio.h>
void fun(int * arr,int n)
{
	int i = 2, j = 0;
	while (n > 1)
	{
		if (n % i == 0)
		{
			arr[j++] = i;
			n /= i;
		}
		else 
		{
			i++;
		}
	}
}
int gcd(int a,int b) 
{
	//因为要进行找这个数的共有的因数,所以这里用数组来接收
	int arr_a[100] = {0};//放a的所有因数
	int arr_b[100] = {0};//放b的所有因数
	//进行放因数
	fun(arr_a,a);
	fun(arr_b,b);

	//找出公共的因数,然后相乘
	int i = 0, j = 0, ret = 1;
	while (arr_a[i] != 0 && arr_b[j] != 0) 
	{
		if (arr_a[i] == arr_b[j]) 
		{
			ret *= arr_a[i];
			i++;
			j++;
		}
		else if (arr_a[i] > arr_b[j])
		{
			j++;
		}
		else
		{
			i++;
		}
	}
	return ret;
}
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = gcd(a,b);//最大公因数
	printf("%d和%d的最大公因数是:%d",a,b,ret);
	return 0;
}

 

4. 穷举法 

 穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法

这里的枚举法就是 先 用一个临时变量来接收(a或b) 其中的一个数,然后连个数进行模运算,两个数都模这个临时变量等于零就是最大公约数,否则临时变量每次减一,然后重复上述。

代码展示 

//穷举法
#include<stdio.h>
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int t = a;
	while (t--)
	{
		if (a % t == 0 && b % t == 0)
			break;
	}
	printf("%d",t);
	return 0;
}

5. 递归法

这里的递归法是基于辗转相除法的思想,然后通过递归来实现。

两个数的最大公约数 ,其中 较小的数  和 两个数相除的余数 的最大公约数

当 y / x%y == 0 时 , y就是最大公约数。

不为0, 就递归 gcd(y,x%y),  gcd 下方代码有描述

算法流程图

代码实现 

#include<stdio.h>
int gcd(int a, int b)
{
	if (b == 0)
		return a;
	else
		return gcd(b,a%b);
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = gcd(a,b);
	printf("%d",ret);
	return 0;
}

6. 短除法

例如:求12与18的最大公因数。以下如有约数出现则为因数

短除法例题:

12的因数有:1、2、3、4、6、12。

18的因数有:1、2、3、6、9、18。

12与18的公因数有:1、2、3、6。

12与18的最大公因数是6。

算法思想:

第一步:先是分别计算处两个数的所有因数,然后分别用数组来进行存放两个数组的所有因数(这里也可以只用一个数组)本例中为方便大家的理解采用两个数组进行存放。

注意:这里的存放也是有技巧的,这里采取的是从大到小进行排序的(当然也可以进行采取从小到大进行排序)

第二步:进行遍历找出相同的因数进行比较,使用一个临时变量用来存放最大公因数

 代码展示

#include<stdio.h>
void fac(int* arr, int n)
{
	int i = 0;
	int j = 0;
	int k = 0;
	for (i = 1; i <= n; i++)
	{
		if (n % i == 0)
		{
			arr[k++] = i;
		}
	}
}
int gcd(int a, int b)
{
	int arr1[100] = { 0 };
	int arr2[100] = { 0 };
	fac(arr1, a);
	fac(arr2, b);

	//求同找最大
	int i = 0, j = 0, max = 1;
	while (arr1[i] != 0 && arr2[j] != 0)
	{
		if (arr1[i] == arr2[j])
		{
			if (max < arr1[i])
			{
				max = arr1[i];
			}
			i++;
			j++;
		}
		else if (arr1[i] < arr2[j])
		{
			i++;
		}
		else
		{
			j++;
		}
	}
	return max;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = gcd(a, b);
	printf("%d 和 %d 的最大公因数为 %d",a,b ,ret);
	return 0;
}

三、总结

这里比较推荐是用 辗转相除法(欧几里得算法)和 《九章算术》中的 更相减损法

多说一下,因为当时阿明浅浅学过遍辗转相除法,然后不久后就忘干净了,用的时候还要再去反复找,为了方便使用,干脆把 求解最大公约数 的几种常见的方法详细介绍一下,虽然不是最好,但是多少希望对大家有些帮助!

希望大家对这些方法,有更加深刻的印象。

加油!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1111641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matplotlib python 画图教程(2)

1、bar 柱状图 import matplotlib.pyplot as plt import numpy as np n12 xnp.arange(12) y1(1-x/float(n))*np.random.uniform(0.5,1,n) y2(1-x/float(n))*np.random.uniform(0.5,1,n) plt.xlim(-.5,n) plt.ylim(-1.25,1.25) plt.xticks([]) plt.yticks([]) plt.bar(x,y1,fac…

利用TypeScript 和 jsdom 库实现自动化抓取数据

以下是一个使用 TypeScript 和 jsdom 库的下载器程序&#xff0c;用于下载zhihu的内容。此程序使用了 duoip.cn/get_proxy 这段代码。 import { JSDOM } from jsdom; import { getProxy } from https://www.duoip.cn/get_proxy;const zhihuUrl https://www.zhihu.com;(async (…

01、Python 安装 ,Pycharm 安装

目录 安装安装 Python安装 Pycharm 创建项目简单添加文件运行 简单爬取下载小视频 安装 python-3.8.10-amd64.exe – 先安装这个 pycharm-community-2022.2.exe 再安装这个 安装 Python python-3.8.10-amd64.exe 安装&#xff08;这个是其他版本的安装&#xff0c;步骤一样…

Linux安装MINIO

MINIO简介MINIO目录 mkdir -p /opt/minio/data && cd /opt/minio MINIO下载 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio MINIO授权 chmod x minio MINIO端口 firewall-cmd --zonepublic --add-port7171/tcp --permanent && firewal…

RTOS(6)任务管理

任务状态理论 我们是怎么实现&#xff0c;两个同优先级的任务之间交替执行的呢&#xff1f; 任务切换的基础&#xff1a;tick中断&#xff01; tick为1ms一个周期&#xff0c;可以通过修改时钟配置修改&#xff1b; running&#xff1a;正在进行的任务3为running&#xff…

20231019 filezilla 配置 Windows与Ubuntu文件传输

SFTP协议&#xff0c;传文件&#xff0c;否则会报无权限错

RTOS(7)同步互斥与通信概述

同步与互斥 同步的例子 循环检测有缺陷&#xff0c;还是得blocked掉&#xff0c;不然会很占用cpu&#xff0c;浪费资源&#xff1b; 互斥的例子 单纯的使用全局变量来实现互斥不太靠谱&#xff0c;当执行时间过长的时候会概率性的出现错误 通信的例子 FreeRtos的解决方案 …

Linux操作系统从BIOS到bootloader是如何运行的

操作系统一般都会在安装在硬盘上&#xff0c;在 BIOS 的界面上。你会看到一个启动盘的选项。启动盘有什么特点呢&#xff1f;它一般在第一个扇区&#xff0c;占 512 字节&#xff0c;而且以 0xAA55 结束。这是一个约定&#xff0c;当满足这个条件的时候&#xff0c;就说明这是一…

浅谈轨道交通建筑能耗分析及节能措施

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;面对城市轨道交通的能耗增长&#xff0c;优化地铁车站建筑、降低运营能耗是促进公共交通可持续化发展的必经之路。通风空调系统的能耗占比较大&#xff0c;节能潜力也是大的。本文以上海首条绿色地铁的项目实…

C#计数排序算法

前言 计数排序是一种非比较性的排序算法&#xff0c;适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数&#xff0c;然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。创建一个长度为max-min1的数组count&a…

售后服务管理升级要怎么做?如何用好售后工单管理系统?

随着数字经济的发展&#xff0c;市场服务趋于多样化&#xff0c;客户对售后服务也有更高的要求&#xff0c;市场竞争日益激烈&#xff0c;越来越多的供应商企业认识到单凭优异的质量&#xff0c;颇具竞争力的价格已不能保证企业的竞争优势&#xff0c;事实表明&#xff0c;用户…

[原创] ElasticSearch集群故障案例分析: 警惕通配符查询

[携程旅行网&#xff1a; 吴晓刚] 许多有RDBMS/SQL背景的开发者&#xff0c;在初次踏入ElasticSearch世界的时候&#xff0c;很容易就想到使用(Wildcard Query)来实现模糊查询&#xff08;比如用户输入补全)&#xff0c;因为这是和SQL里like操作最相似的查询方式&#xff0c;用…

常见面试题-Redis专栏(一)

typora-copy-images-to: imgs了解 redis 中的大key吗&#xff1f;多大算是大key呢&#xff1f;如何解决&#xff1f; 答&#xff1a; redis 的大 key 指的是 key 对应的 value 所占用的内存比较大。 对于 string 类型来说&#xff0c;一般情况下超过 10KB 则认为是大 key&…

waf、yakit和ssh免密登录

WAF安全狗 脏数据适用于所有漏洞绕过waf&#xff0c;但是前提条件垃圾信息必须放在危险信息前&#xff0c;是不能打断原有数据包的结构&#xff0c;不能影响后端对数据包的解析。 以DVWA靶场文件上传为例 新建php文件 上传文件被安全狗拦截 使用bp抓包查看 在数据包Content-…

Anomalib 图像异常检测算法

图像异常检测算法 1.简介1.1. 问题描述1.2. 挑战与需求 2. 图像异常检测定义2.1 异常的定义及类型2.2 图像数据中的异常 3. 图像异常检测技术研究现状4.方法5.安装和使用5.1 安装PyPI 安装本地安装 5.2 训练5.3 特征提取与&#xff08;预训练&#xff09;backones5.4 自定义数据…

DVWA-弱会话IDS

弱会话IDS Session简介&#xff1a; 用户登录后&#xff0c;在服务器就会创建一个会话(session)&#xff0c;叫做会话控制&#xff0c;接着访问页面的时候就不用登录&#xff0c;只需要携带Session去访问即可。 sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算…

HTML构建图文并茂类页面----HTML插入图片

插入图片 插入方式1&#xff1a;使用img标签插入图片 例如&#xff1a;<img src"img/2ee18-231100-163232346010b0.jpg" alt"用户注册按钮位置" title"用户注册1" width"1138px"/> 插入方式2 图片做背景&#xff1a;使用styl…

HarmonyOS音频开发指导:使用AVPlayer开发音频播放功能

如何选择音频播放开发方式 在HarmonyOS系统中&#xff0c;多种API都提供了音频播放开发的支持&#xff0c;不同的API适用于不同音频数据格式、音频资源来源、音频使用场景&#xff0c;甚至是不同开发语言。因此&#xff0c;选择合适的音频播放API&#xff0c;有助于降低开发工…

二维码智慧门牌管理系统:打造智慧城市之路

文章目录 前言一、二维码智慧门牌管理系统开发背景二、二维码智慧门牌管理系统开发目标三、二维码智慧门牌管理系统的实现四、二维码智慧门牌管理系统在智慧城市构建中的重要性 前言 随着科技的不断发展&#xff0c;智慧城市已经成为了现代城市规划与发展的核心。为了实现智慧…

C/C++ 快速入门

参考&#xff1a;https://blog.csdn.net/gao_zhennan/article/details/128769439 1 下载Visual Studio Code并安装中文插件&#xff0c;此处不再叙述 2 插件安装C/C插件 3 使用快捷键【Ctr ~】打打开终端 验证并未安装编译器 4 我们即将使用【MinGW-64】做为编译器 https:…