求最大公因数的几种算法
我们经常会遇到有关数论的题目,求解最大公因数便是常见的题目之一,以下为几种常见的方法,他们的主要结构均为递归
(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递减,直至找到一个能被两者都整除的数. public static int gcd1(int x, int y){int mi ...
- java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园
求两个自然数m和n的最大公约数. 连续整除检测: 1. t=min{m,n}: 2. m除以t,如果余数为0,则执行步骤3,否则,执行步骤4: 3. n除以t,如果余数为0,返回t的值作为结果,否则, ...
- 三位数求最大公因数c语言,求最大公因数的三种算法
欧几里得算法 #include using namespace std; int fun(int a, int b){ if (a >= b){ int r = a%b; if (r == 0) ...
- 求最大公因数的三种算法
欧几里得算法 #include<iostream> using namespace std;int fun(int a, int b){if (a >= b){int r = a%b ...
- 求最大公因数的两种方法(高效方法)
给定两个数,例如a=27,b=12a=27, b=12a=27,b=12,我们知道a, b的最大公因数为3. 下面将介绍两种求最大公因数的高效方法: (1)辗转相除法 辗转相除法有一个高大上的名字:欧 ...
- 求最小公倍数与最大公因数的三种算法
作者:Angel_Kitty 出处:http://www.cnblogs.com/ECJTUACM-873284962/ 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: ...
- 〖数学算法〗求圆周率的几种算法
圆周率大家都不陌生,最早由欧几里德<几何原本>中提到圆周率是常数,第一个用寻求圆周率数值的人是阿基米德,中国数学家刘徽,和后来大名鼎鼎的祖冲之分别对圆周率进行了计算,从古到今对圆周率的计算 ...
- 【matlab 圆周率计算】matlab 求圆周率的两种算法实现比较
%author:laidefa %data:2014-09-19 %丘德诺夫斯基公式求圆周率 function mpi=qdnfsj(m) i=m; s=13591409; for n=1:i A=( ...
- c语言用除法求平均数,论C语言两整数平均值的4种算法
小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言#include #include int main() { int a = 10; int b = ...
最新文章
- 《结网》十年,《结网2》开启产品经理的无限游戏
- linux 后台任务 前台任务 查看切换终止开始命令 bg、fg、ctrl+z、ctrl+d和ctrl+c 简介
- Oh My God!e.printStackTrace() 导致系统卡崩
- linux nfs时间不对,NFS挂载主机或不稳定的原因与解决方法
- LevelDB 源码剖析(三)公共基础:内存管理、数值编码、Env家族、文件操作
- 具有外部Zookeeper集成并使用SOLRJ API访问数据的SOLR cloud 7.4集群配置
- opencv-4.5.3 + opencv_contrib-4.5.3 + vtk-9.0.3编译(全流程)
- 数据集转josion
- 从事前端开发,日常工作中必备的工具有哪些?
- 南京大学计算机学硕博士,2019年南京大学计算机软件研究所招收研究生说明
- Unity MMO游戏架构设计之角色设计一
- python缺失数据处理_python 缺失值处理的方法(Imputation)
- Docker部署微服务应用笔记(三)
- 【目标设定】1. 目标设定模板
- 面试高频算法题补充系列:木棍切割问题
- Python集合和字符串及练习
- 互联网金融和信贷风控的概述
- 2021年电气试验免费试题及电气试验模拟考试题
- 把Excel表格发给领导看,如何快速查找表格改动的地方?
- 安全驾驶-注意交通提示牌(二十)