最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。

也称最大公因数、最大公因子,a, b的最大公约数记为(a,b),同样的,a,b,c的最大 公约数记为(a,b,c),多个 整数的最大公约数也有同样的记号。求最大公约数有多种 方法,常见的有 质因数分解法、 短除法、 辗转相除法、 更相减损法。与最大公约数相对应的概念是 最小公倍数,a,b的 最小公倍数记为[a,b]。

再来介绍一下辗转相除法:

辗转相除法又叫欧几里得算法,是欧几里得最先提出来的.辗转相除法的实现,是基于下面的原理(在这里用(a,b)表示a和b的最大公因数):
  (a,b)=(a,ka+b),其中a、b、k都为自然数.………………①
  也就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2.要证明这个原理很容易:如果p是a和ka+b的公约数,p整除a,也能整除ka+b.那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的.
  基于上面的原理,就能实现我们的迭代相减法:
  (78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2
  基本上思路就是大数减去小数,一直减到能算出来为止,在作为练习的时候,往往进行到某一步就已经可以看出得值.迭代相减法简单,不过步数比较多,实际上我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法.
  用辗转相除法求(a,b).设r0=b,r1=a,反复运用除法算式,得到一系列整数qi,ri和下面的方程:
  相当于每一步都运用原理①把数字进行缩小,上面右边就是每一步对应的缩小结果,可以看出,最后的余数rn就是a和b的公约数.迭代相减法和辗转相除法在本质上是一样的,相对来说,减法比较简单(需要10步),但是除法步数少(仅需4步).

因此可以通过这个原理来求出最大公约数:

#include<iostream>
#include<cstdio>
using namespace std;int fun(int m,int n){int rem;           //余数,当余数为0的时候,最后的m即为最大公约数//先用较小的数对较大的数取余,再用余数对较小的数求余,直到余数为零 while(n > 0){rem = m % n;m = n;n = rem;}return m;         //将结果返回
}
int main(){int n,m;cin>>m>>n;cout<<"m和n的最大公约数为:"<<fun(m,n)<<endl;return 0;
} 

因为到余数为零结束,所以还可以将程序简化一下用递归来求:

int fun(int m,int n){if(n==0) return m;return fun(n,m%n);
}

再简化一下,用一行代码来求:

int gcd(int m, int n) {return n ? gcd(n, m % n) : m;
}

求最大公约数(辗转相除法)相关推荐

  1. 求最大公约数——辗转相除法

    最大公约数的基本原理: 两个数的最大公约数是指能同时整除它们的最大正整数. 设两数为a.b(a≥b),求a和b最大公约数. 辗转相除法 代码如下: //只截取了一部分,完整代码可看下方 while ( ...

  2. 求最大公约数----辗转相除法

    辗转相除法(求最大公倍数) 一般写法: public class Main {public static void main(String[] args) {System.out.println(gc ...

  3. leetcode----1447.最简分数(辗转相除法求最大公约数)

    1447.最简分数 问题:给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 .分数可以以 任意 顺序返回. 示例: 输入:n = 2 输出: ...

  4. c语言用质因数分解法求最大公约数,分解质因数法求最大公约数(javascrip实现)

    //判断是否为质数------------------------------------------------------ function isPrime(n) { for (var i = n ...

  5. c++递归求最大公约数

    辗转相除法求最大公约数 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫 欧几里德算法. 这就是辗转相除法的原理. 例如,求(319,377): ∵ 319÷377=0(余319) ∴ ...

  6. 辗转相除法(欧几里得算法)求 最大公约数与最小公倍数+推论与证明。

    首先我们规定:0不参与公约数和公倍数的讨论 先来讨论最大公约数: 最大公约数求法:两个数的所有公共质数相乘. 考虑三个问题. 为什么是公共的:公共代表这个数可以被两个数都整除 为什么是质数:合数一定能 ...

  7. 分别求两个整数的最大公约数和最小公倍数。_看不懂辗转相除法求最小公约数?以身相许那种哦!...

    给你打个比喻吧:你英雄救美了,美女想要报答你,你想要1000块感谢费,但是美女却想要以身相许 ,懂了吧,同样都是报答,只是用了不一样的方式,辗转相除法也是这样,你两个数的最大公约数不容易求,我就用另外 ...

  8. 利用辗转相除法——求最大公约数(详解)

    辗转相除法 求最大公约数: 给定两个数,求这两个数的最大公约数 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数.应用领域有数学和计算机两个方面.计算公式gcd(a,b) = g ...

  9. 多项式辗转相除法求最大公约数_辗转相除法求最大公约数

    辗转相除法求最大公约数 约数 如果数 a 能被数 b 整除,a 就叫做 b 的倍数,b 就叫做 a 的约数. 最大公约数 最大公约数就是两个数中,大家都能相约且最大的数. 辗转相除法 辗转相除法又名欧 ...

  10. 辗转相除法求最大公约数原理分析(附代码实现)

    辗转相除法求最大公约数原理分析(附代码实现) 前言 解释 原理分析 代码 结语 前言 辗转相除法用起来很简单,但是其原理却自己想不明白.于是乎看了几篇有关辗转相除法原理的分析,在这里自己写下自己的理解 ...

最新文章

  1. 反季大清仓,最低仅需34.9元
  2. 八、逆波兰计算器的分析与实现
  3. dom不刷新 vue 加数据后_高频出现的Vue 面试题及答案
  4. Idea快速生成War包
  5. SQLSERVER EXCEPT运算符=ORACLE MINUS
  6. C++与Java中的static成员总结
  7. wps office oa控件 痕迹_WPS加载项案例应用回顾
  8. Javascript -- 二叉树实现
  9. JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案
  10. scale缩放中心_规范化(包含归一化)、标准化、中心化、BN、正则化的区别
  11. 14.凤凰架构:构建可靠的大型分布式系统 --- 资源与调度
  12. 对通用查询组件初始化组织过滤条件
  13. 史上最全的人工智能知识图谱
  14. makefile中的notdir,wildcard和patsubst
  15. 【路径规划】基于matlab A_star算法机器人动静态避障路径规划【含Matlab源码 371期】
  16. 深度学习入门,Keras Conv2D类参数详解
  17. 新买的笔记本电脑分区,笔记本分区分错了怎么重新分
  18. iOS技术总结1——3D Touch技术
  19. 异步电机三相电流滞环矢量控制
  20. Android注解@TargetApi和@RequiresApi什么意思?

热门文章

  1. 车广告讲堂之 广告设计字体美身
  2. 2022Adobe全套资源|PS PR AE
  3. C++ intptr_t类型
  4. uboot移植——命令体系
  5. Linux 系统实现 SSH 连接的 3 种 方式
  6. python在线题库推荐_Python题库.docx
  7. PLSQL导出表结构和数据
  8. JLINK 驱动安装和配置ADS使用,ADX调试
  9. 串口的定义,232,485,UART,TTL之间的区别和关系到底是什么
  10. 跟着迪哥学python电子书pdf-跟着迪哥学Python数据分析与机器学习实战