C++辗转相除法详解
求最大公约数有两种方法:
1.暴力枚举,从两个数中较小的那个数开始,一个一个从大到小枚举,最先枚举到的,就是
最大公约数
,此方法很简单,但是速度较慢。2.欧几里德算法(也叫辗转相除法),公式:
gcd(a,b) = gcd(b,a mod b)
证明过程如下:
辗转相除法的证明方法(摘自百度):
证法一
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r因此d也是b,a mod b的公约数假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数。进而d|a.因此d也是a,b的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
证法二
假设c = gcd(a,b),则存在m,n,使a = mc, b = nc;令r = a mod b,即存在k,使r = a-kb = mc - knc = (m-kn)c;故gcd(b,a mod b) = gdc(b,r) = gcd(nc,(m-kn)c) = gcd(n,m-kn)*c;假设d = gcd(n,m-kn), 则存在x,y, 使n = xd, m-kn = yd; 故m = yd+kn = yd+kxd = (y+kx)d;故有a = mc = (y+kx)dc, b = nc = xdc; 可得 gcd(a,b) = gcd((y+kx)dc,xdc) = dc;由于gcd(a,b) = c, 故d = 1;即gcd(n,m-kn) = 1, 故可得gcd(b,a mod b) = c;可得证gcd(a,b) = gcd(b,a mod b).
C++代码实现gcd(a,b) = gcd(b,a mod b)
:
inline int GCD(int a,int b){ //inline可以优化函数,减小内存
int n=a>b?a:b; //三元运算符,结构:`条件?语句1:语句二`。等价于 if(a>b) n=a; else n=b;
int m=b>a?a:b;
if(n%m==0) return m; //如果n%m结果为0,输出m
return GCD(m,n%m); //余数不为0,n替换为m;m替换为n%m;
}
知道了gcd(a,b) = gcd(b,a mod b)
公式怎么实现,就可以写出代码了。
code:
#include<cstdio> //scanf和printf的头文件
using namespace std;
int a,b;
inline int GCD(int a,int b){ //上面有了,不解释int n=a>b?a:b;int m=b>a?a:b;if(n%m==0) return m;return GCD(m,n%m);
}
int main(){scanf("%d%d",&a,&b); //输入a,bprintf("%d",GCD(a,b)); //输出答案
}
还有有疑问可以在此处寻找更多优秀文章或者在评论中提出哦~
C++辗转相除法详解相关推荐
- 辗转相除法详解(C语言实现)
辗转相除法 定义 基本原理 原理 证明 算法实现 思想 C语言实现 定义 辗转相除法,被称为欧几里得(Euclidean)算法,是求最大公约数的算法. 基本原理 原理 两个正整数a和b(a > ...
- 密码学:RSA加密算法详解
概述 本文旨在说明RSA加密算法的原理及实现,而其相关的数学部分的证明则不是本文内容. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Q-WHai 发表日期: ...
- md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?
算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发.软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能.算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程 ...
- php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...
详解C语言求两个数的最大公约数及最小公倍数的方法 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y) ...
- 【中国剩余定理】互素与不互素的情况详解
侵权则删(这个现在更多是作为笔记存在,因为写的时间有点久了,不知道参考了多少篇资料汇总的,发现的话会补上的,也非常感谢在网上分享知识的人) 这篇文章很少涉及特别基础的数学公式,但是相信能够帮助你理解, ...
- C语言求最大公约数三种方法详解
C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...
- C语言:最大公约数详解
C语言:最大公约数详解 Hello!小伙伴们大家好,几天不见了,今天给大家分享一下C语言中求最大公约数的三种方法.在开始分享前,让我们先来看看什么是最大公约数:最大公约数,也称最大公约数.最大公因子, ...
- 【算法学习】欧几里得算法详解(包括扩展、同余方程)
欧几里得算法详解(包括扩展.同余方程) 1.普通欧几里得算法(求最大公约数) 2.扩展欧几里得算法(求解a*x+b*y=c中(x,y)) 3.同余方程 1.普通欧几里得算法(求最大公约数) 欧几里得算 ...
- 乘法逆元(inverse element)及四大相关求法详解(含证明)
文章目录 乘法逆元及四大相关求法详解(含证明) 开胃菜 1. 定义及理解 1.1 乘法逆元的定义 1.1.1 极简定义 1.1.2 详细定义 1.1.3 理解及其相关证明<br> 2. 逆 ...
最新文章
- java将读到的换行符存储到数据表中_Java学习之路013天
- 浅谈三维点云中的几何语义
- 目标检测--Beyond Skip Connections: Top-Down Modulation for Object Detection
- Torch not compiled with CUDA enabled
- 设计模式(面向对象)设计的七大原则
- java实用教程——组件及事件处理——布局管理(五种)
- PS(留学动机)的妙用——扭转你的劣势
- linux 路由协议,路由协议之RIP协议
- 定时重启软件_办公电脑怎样设置定时重启?依靠这款工具即可轻松实现
- cfile清空文件内容_体育老师学编程(第11天)python常用的文件读写操作
- 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库
- 机器学习中的特征工程总结
- GPS坐标与UTM坐标的转换
- 关于地理数据收集与处理的基本工具推荐(3)--最新30m的DEM与DSM数据免费下载
- 天翼云服务器搭建网站必须要知道的血泪史!
- 日式卡通渲染的效果的unity实现
- 教你一键采集天猫商品主图视频的方法及步骤
- 转-SIP穿越NAT SIP穿越防火墙
- Dojo官方教程:Charting
- linux7.5开放端口,Centos/linux开放端口
热门文章
- ipdb 调试 Python
- UltraEdit 10.20c 下载及注册
- php做的中秋博饼游戏之绘制骰子图案功能示例
- Pytorch之view,reshape,resize函数
- PetiteVue - Vue 作者尤雨溪新作品,小巧精简版的 Vue
- X299+10代10900XOpenCore引导安装macOS Catalina10.15.5
- 图片大全 | 常用电子接口大全
- Tensorflow迁移学习实现猫狗大战
- Sqlserver数据库分离失败 数据库被误删找不到文件解决方案
- 如何养成最高效的工作方法