我们经常会遇到有关数论的题目,求解最大公因数便是常见的题目之一,以下为几种常见的方法,他们的主要结构均为递归

(1)辗转相除法
这便是著名的欧几里得算法
Euclid规则:如果x和y是正整数,且有x>=y,那么gcd(x,y)=gcd(x mod y,y)。

int gcd(int a,int b)
{if(a<b){swap(a,b);}if(b==0){return a;}return gcd(b,a%b);
}

例如:求25和11两个数的最大公约数,即求gcd(25,11)
a = x * b + y --> b = x’ * (a%b) + y’ 当y‘==0时,a%b即为它俩的最大公约数
25 = 2 * 11 + 3
11 = 3 * 3 + 2
3 = 1 * 2 + 1
2 = 2 * 1 + 0

(2)更相减损法
百度百科中的介绍如下:
更相减损法,又称"等值算法"
“关于约分问题,实质是如何求分子,分母最大公约数的问题.《九章算术》中介绍了这个方法,叫做”更相减损术”,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
  翻译成现代语言如下:
  第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
  第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
  则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
  
非递归实现

int gcd2(int a,int b)
{int ans=1;while(a%2!=0&&b%2!=0){a = a/2;b = b/2;ans=ans*2;}while(a != b){if(a>b){a = a-b;}else{b = b-a;}}return ans*a;
}

递归实现

int gcd2_2(int a,int b)
{if(a<b){swap(a,b);}if(a==b){return a;}int temp=a-b;if(temp<b){return gcd2_2(b,temp); }else{return gcd2_2(temp,b);}}

递归实现实现需在a,b为奇数时实现
当a,b为任意正整数时,可用如下方式结合然后加以实现:

int gcd2(int a,int b)
{int ans=1;while(a%2!=0&&b%2!=0){a = a/2;b = b/2;ans=ans*2;}a=gcd2_2(a,b);return ans*a;
}

例如:求91和49的最大公约数gcd2(91,49)
91 - 49 = 42
49 - 42 = 7
42 - 7 = 35
35 - 7 = 28
28 - 7 = 14
14 - 7 = 7

(3)分治法
算法思想:
当a,b都是偶数时,gcd(a,b)=2*gcd(a/2,b/2);
当a是奇数,b是偶数时,gcd(a,b)=gcd(a,b/2);
当a是偶数,b是奇数时,gcd(a,b)=gcd(a/2,b);
当a,b都是奇数时,gcd(a,b)=gcd((a-b)/2,b).

代码实现如下:

int gcd3(int a,int b)
{if(a<b){swap(a,b);}if(b==0){return a;}if(a%2==0&&b%2==0){return 2*gcd3(a/2,b/2);}else if(a%2!=0&&b%2==0){return gcd3(a,b/2);}else if(a%2==0&&b%2!=0){return gcd3(a/2,b);}else if(a%2!=0&&b%2!=0){return gcd3((a-b)/2,b);}
}

这是我第一次写博客啦,纪念一下,哈哈哈哈哈哈哈哈哈哈
2019.3.25晚

求最大公因数的几种算法相关推荐

  1. 求最大公因数的三种算法及简要说明

    求最大公因数的三种算法及简要说明 1.连续整数法 从给定的最小的数开始按1递减,直至找到一个能被两者都整除的数. public static int gcd1(int x, int y){int mi ...

  2. java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园

    求两个自然数m和n的最大公约数. 连续整除检测: 1. t=min{m,n}: 2. m除以t,如果余数为0,则执行步骤3,否则,执行步骤4: 3. n除以t,如果余数为0,返回t的值作为结果,否则, ...

  3. 三位数求最大公因数c语言,求最大公因数的三种算法

    欧几里得算法 #include using namespace std; int fun(int a, int b){ if (a >= b){ int r = a%b; if (r == 0) ...

  4. 求最大公因数的三种算法

    欧几里得算法 #include<iostream> using namespace std;int fun(int a, int b){if (a >= b){int r = a%b ...

  5. 求最大公因数的两种方法(高效方法)

    给定两个数,例如a=27,b=12a=27, b=12a=27,b=12,我们知道a, b的最大公因数为3. 下面将介绍两种求最大公因数的高效方法: (1)辗转相除法 辗转相除法有一个高大上的名字:欧 ...

  6. 求最小公倍数与最大公因数的三种算法

    作者:Angel_Kitty 出处:http://www.cnblogs.com/ECJTUACM-873284962/ 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: ...

  7. 〖数学算法〗求圆周率的几种算法

    圆周率大家都不陌生,最早由欧几里德<几何原本>中提到圆周率是常数,第一个用寻求圆周率数值的人是阿基米德,中国数学家刘徽,和后来大名鼎鼎的祖冲之分别对圆周率进行了计算,从古到今对圆周率的计算 ...

  8. 【matlab 圆周率计算】matlab 求圆周率的两种算法实现比较

    %author:laidefa %data:2014-09-19 %丘德诺夫斯基公式求圆周率 function mpi=qdnfsj(m) i=m; s=13591409; for n=1:i A=( ...

  9. c语言用除法求平均数,论C语言两整数平均值的4种算法

    小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言#include #include int main() { int a = 10; int b =  ...

最新文章

  1. 《结网》十年,《结网2》开启产品经理的无限游戏
  2. linux 后台任务 前台任务 查看切换终止开始命令 bg、fg、ctrl+z、ctrl+d和ctrl+c 简介
  3. Oh My God!e.printStackTrace() 导致系统卡崩
  4. linux nfs时间不对,NFS挂载主机或不稳定的原因与解决方法
  5. LevelDB 源码剖析(三)公共基础:内存管理、数值编码、Env家族、文件操作
  6. 具有外部Zookeeper集成并使用SOLRJ API访问数据的SOLR cloud 7.4集群配置
  7. opencv-4.5.3 + opencv_contrib-4.5.3 + vtk-9.0.3编译(全流程)
  8. 数据集转josion
  9. 从事前端开发,日常工作中必备的工具有哪些?
  10. 南京大学计算机学硕博士,2019年南京大学计算机软件研究所招收研究生说明
  11. Unity MMO游戏架构设计之角色设计一
  12. python缺失数据处理_python 缺失值处理的方法(Imputation)
  13. Docker部署微服务应用笔记(三)
  14. 【目标设定】1. 目标设定模板
  15. 面试高频算法题补充系列:木棍切割问题
  16. Python集合和字符串及练习
  17. 互联网金融和信贷风控的概述
  18. 2021年电气试验免费试题及电气试验模拟考试题
  19. 把Excel表格发给领导看,如何快速查找表格改动的地方?
  20. 安全驾驶-注意交通提示牌(二十)

热门文章

  1. 男闺蜜下载 v1.6.2 安卓版
  2. vlan的tagged、untagged
  3. Scratch所有积木
  4. Dev GridView网格中格式化 TimeSpan
  5. 新买的联想笔记本计算机选项,怎么我的计算机一开机全部都是雪花
  6. 用C语言和JS分别实现“个税年度汇算清缴”计算
  7. 企业微信会话存档功能的推出背景,版本,部署方式
  8. 【群友问题讨论】java类对象数组一些知识盲区
  9. 23模式--建造者模式
  10. [CF1421E]Swedish Heroes