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

目录

一、关于公约数

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

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;elseb = 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;elsereturn 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.mzph.cn/news/111799.shtml

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

相关文章

SVN一直报错Error running context: 由于目标计算机积极拒绝,无法连接。解决办法【杭州多测师_王sir】...

一、发现SVN一直报错Error running context: 由于目标计算机积极拒绝&#xff0c;无法连接。 二、没有启动 VisualSVN Server。cmd--> services.msc打开本地服务。查看VisualSVN的三个服务的启动类型&#xff0c;建议选择“手动”&#xff0c;不能选择“禁用”&#xff0c;选…

C++设计模式_09_Abstract Factory 抽象工厂

与上篇介绍的Factory Method工厂方法模式一样&#xff0c;Abstract Factory 抽象工厂模式也属于典型的“对象创建模式”模式&#xff0c;解决的问题也极其相似&#xff0c;在理解了Factory Method工厂方法模式的基础上再去理解Abstract Factory 抽象工厂模式就会变得更加容易。…

docker容器健康状态健康脚本

代码&#xff1a; #!/bin/bash# 定义要监控的容器名称 container_name"mysql-container"# 使用Docker命令来检查容器的运行状态 container_status$(docker inspect --format"{{.State.Status}}" "$container_name")# 检查容器状态并进行相应操作…

uniapp实现简单的九宫格抽奖(附源码)

效果展示 uniapp实现大转盘抽奖 实现步骤&#xff1a; 1.该页面可设置8个奖品&#xff0c;每个奖品可设置中奖机会的权重&#xff0c;如下chance越大&#xff0c;中奖概率越高&#xff08;大于0&#xff09; // 示例代码 prizeList: [{id: 1,image: "https://img.alicdn…

如何注册微信小程序

如何注册微信小程序 前言 因为最近沉迷和朋友们一起下班去打麻将&#xff0c;他们推荐了一个计分的小程序&#xff0c;就不需要每局都转账或者用扑克牌记录了&#xff0c;但是这个小程序不仅打开有广告&#xff0c;各个页面都植入了广告&#xff0c;用起来十分不适。 于是我…

【Cisco】解决小米手机无法连接WIFI的问题

问题来源&#xff1a;领导的小米Note7旧手机无法连接到公司的wifi上&#xff0c;确定密码什么的都没有问题。 无线环境&#xff1a; Cisco Catalyst 9800-L Wireless Controller Cisco Catalyst 9115 AP 可能原因&#xff1a;可能是Cisco 9100系列 AP 和 Android 10设备&#…

eNSP-OSPF协议其他区域不与骨干区域相连解决方法1

OSPF多进程路由重分布 AR1 [ar1]int g0/0/0 [ar1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [ar1-GigabitEthernet0/0/0]quit [ar1]ospf [ar1-ospf-1]area 0 [ar1-ospf-1-area-0.0.0.0]net 192.168.1.0 0.0.0.255 [ar1-ospf-1-area-0.0.0.0]quit AR2 [ar2]int g0/0/0 [ar2…

微服务docker部署实战

docker基础和进阶(*已掌握的可以跳过 *) 基础 docker基础 进阶 docker进阶 准备工作 提前准备好mysql和redis的配置&#xff0c;如下 在/zzq/mysql/conf目录下配置mysql配置文件my.cnf [client] #设置客户端字符集 default_character_setutf8 [mysqld] #开启定时任务 event_s…

微信小程序4

一自定义组件应用 1.介绍 微信小程序自定义组件是指开发者可以自定义组件&#xff0c;将一些常用的 UI 元素封装成一个自定义组件&#xff0c;然后在多个页面中复用该组件&#xff0c;实现代码复用和页面性能优化的效果。 2.自定义组件分为两种类型 组件模板类型&#xff1a;…

【14】基础知识:React - redux

一、 redux理解 1、学习文档 英文文档&#xff1a;https://redux.js.org/ 中文文档&#xff1a;http://www.redux.org.cn/ Github: https://github.com/reactjs/redux 2、redux是什么 redux 是一个专门用于做状态管理的 JS 库(不是 react 插件库)。 它可以用在 react&am…

求助C语言大佬:C语言的main函数参数问题

最近在敲代码的过程中&#xff0c;突发奇想&#xff0c;产生了一个疑问&#xff1a; 为什么main函数可以任由我们定义&#xff1a;可以接收一个参数、两个参数、三个参数都接接收&#xff0c;或者可以不接收&#xff1f;这是如何实现的 int main(){retrun 0; } int main (int…

怎么使用LightPicture开源搭建图片管理系统并远程访问?【搭建私人图床】

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

TSINGSEE智慧港口可视化智能监管解决方案,助力港口码头高效监管

一、方案背景 全球经济一体化进程以及国际市场的不断融合&#xff0c;使得港口码头成为了大型货运周转中心&#xff0c;每天数以百计的大型货轮、数以千计的大型集装箱、数以万计的人员流动。港口作为货物、集装箱堆放及中转机构&#xff0c;具有昼夜不歇、天气多变、环境恶劣…

rust学习—— 控制流if 表达式

控制流 根据条件是否为真来决定是否执行某些代码&#xff0c;或根据条件是否为真来重复运行一段代码&#xff0c;是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。 if 表达式 if 表达式允许根据条件执行不同的代码分支。你提供…

c: Queue Calling in Ubuntu

/*** file TakeNumber.h* author your name (geovindu)* brief * version 0.1* date 2023-10-20* * copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */#ifndef TAKENUMBER_H #define TAKENUMBER_H#include <stdio.h> #include <…

nginx 内存管理(一)

文章目录 前提知识nginx内存管理的基础内存分配不初始化封装malloc初始化malloc 内存池内存池结构清理函数cleanup大块内存large 创建内存池申请内存void *ngx_palloc(ngx_pool_t *pool, size_t size)void *ngx_pnalloc(ngx_pool_t *pool, size_t size)void *ngx_pcalloc(ngx_p…

6 个可解锁部分 GPT-4 功能的 Chrome 扩展(无需支付 ChatGPT Plus 费用)

在过去的几个月里&#xff0c;我广泛探索了 ChatGPT 的所有可用插件。在此期间&#xff0c;我发现了一些令人惊叹的插件&#xff0c;它们改进了我使用 ChatGPT 的方式&#xff0c;但现在&#xff0c;我将透露一些您需要了解的内容。 借助 Chrome 扩展程序&#xff0c;所有 Chat…

单片机判断语句与位运算的坑

一.问题描述 在我判断Oled的某点的值是否为1时,用到了如下判断语句 if(oled[x][y/8] &1<<(y%8)但是,当我将其改为如下的判断语句,代码却跑出BUG了 if((oled[x][y/8]&1<<(y%8))1)二.原因分析 1.if语句理解错误 首选让我们看看下面的代码运行结果 #inc…

Django中ORM框架的各个操作

我们会好奇&#xff0c;python这么简洁的语言&#xff0c;数据查询是如何做的呢&#xff1f;我将进一步详细和深入地介绍Django中ORM框架的各个方面&#xff0c;包括MySQL的增删改查和复杂查询。让我们分步骤进行。 ORM框架介绍 Django的ORM框架是一个用于与数据库进行交互的工…

Stable Diffusion WebUI扩展a1111-sd-webui-tagcomplete之Booru风格Tag自动补全功能详细介绍

安装地址 直接附上地址先: Ranting8323 / A1111 Sd Webui Tagcomplete GitCodeGitCode——开源代码托管平台,独立第三方开源社区,Git/Github/Gitlabhttps://gitcode.net/ranting8323/a1111-sd-webui-tagcomplete.git上面是GitCode的地址,下面是GitHub的地址,根据自身情…