求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法
辗转相除法——
辗转相除法求最大公约数的原理:
两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数。
辗转相除法求最小公倍数的原理:
两个整数分别除以最大公约数的结果相乘,再乘以最大公约数;
简化后即 两个整数相乘再乘以最小公倍数。
代码示例如下:
#include<iostream>
using namespace std;// GCD:greatest common divisor
// LCM:least common multiple
//递归
int gcd(int m,int n)//最大公约数
{if (m % n == 0)return n;return gcd(n, m % n);
}int lcm(int m, int n)//最小公倍数
{return m * n / gcd(m, n);
}int main()
{int m,n;//输入cin >> m >> n;//最大公约数int yue = gcd(m, n);//最小公倍数int bei = lcm(m, n);//输出cout << "最大公约数:" << yue << endl;cout << "最小公倍数:" << bei << endl;return 0;
}
输入:
12 16
输出:
最大公约数:4
最小公倍数:48
更相减损术——
更相减损术求最大公约数的原理:
两个整数其中较小数 与 两数相减(较大数减较小数)的差值(使用递归)的最大公约数。
更相减损术求最小公倍数的原理:
与辗转相除法相同。
代码示例如下:
#include<iostream>
using namespace std;// GCD:greatest common divisor
// LCM:least common multiple
int gcd(int a,int b)//最大公约数
{//首先判断大小,必须大的减小的;int m = a > b ? a : b;int n = a > b ? b : a;if ((m - n) == 0)return n;return gcd(n, m - n);
}int lcm(int m, int n)//最小公倍数
{return m * n / gcd(m, n);
}int main()
{int m,n;//输入cin >> m >> n;//最大公约数int yue = gcd(m, n);//最小公倍数int bei = lcm(m, n);//输出cout << "最大公约数:" << yue << endl;cout << "最小公倍数:" << bei << endl;return 0;
}
输入:
9 12
输出:
最大公约数:3
最小公倍数:36
stein算法——
stein算法求最大公约数的原理:
- 若两个都是偶数,则都除2(即右移1位),并记录下公约数2;
- 若两个一奇一偶,则偶数除2(因为此时2不可能是这两个数的公约数了);
- 若两个都是奇数,则使用更相减损术。
stein算法求最小公倍数的原理:
与辗转相除法相同。
代码示例如下:
#include<iostream>
#include<math.h>
using namespace std;// GCD:greatest common divisor
// LCM:least common multipleint stein_gcd(int a, int b)//最大公约数
{if ((a & 1) == 0 && (b & 1) == 0)return stein_gcd(a >> 1, b >> 1) << 1;else if ((a & 1) == 0 && (b & 1) != 0)return stein_gcd(a >> 1, b);else if ((a & 1) != 0 && (b & 1) == 0)return stein_gcd(a, b >> 1);else{//更相减损术int m = a > b ? a : b;int n = a > b ? b : a;if ((m - n) == 0)return n;return stein_gcd(n, m - n);}
}
int lcm(int m, int n)//最小公倍数
{return m * n / stein_gcd(m, n);}int main()
{int m, n;int yue, bei;//输入cin >> m >> n;//最大公约数yue = stein_gcd(m, n);//最小公倍数bei = lcm(m, n);//输出cout << "最大公约数:" << yue << endl;cout << "最小公倍数:" << bei << endl;return 0;
}
输入:
14 6
输出:
最大公约数:2
最小公倍数:42
求最大公约数相关方法的复杂度计算:
1、暴力枚举法:O(min(m, n)));
2、辗转相除法:取模运算性能较差,可以近似为O(log(max(m, n)));
3、更相减损术:避免了取模运算,但是算法性能不稳定,最坏时间复杂度为O(max(m, n));
4、 stein算法:不但避免了取模运算,而且算法性能稳定,时间复杂度为O(log(max(m, n)))。
求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法相关推荐
- PYTHON语言编写求最大公约数和最小公倍数的程序(更相减损法)
#更相减损术求GCD.py x,y=eval(input("请输入一个整数:")) t1,t2=x,y while True:a=abs(x-y)if a==min(x,y):br ...
- 【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程
欧几里得 说在前面 数论学复习 Part 6. 然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP. 计划很美啊你. P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊. 有一 ...
- 【C语言】辗转相除法+更相减损术+秦九韶算法
一.辗转相除法 1.简介 辗转相除法又叫欧几里得算法. 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的: 1997 / 615 = 3 (余 152) 615 ...
- 欧几里得算法和更相减损术证明
欧几里得算法 gcd(greatest common divisor) 最大公约数,指两个整数所有公共约数中最大的. 首先先上结论,求最大公约数,我们可以通过递归c=a%b,gcd(a,b)=gcd( ...
- C++算法:辗转相除法与更相减损术
辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...
- 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起
「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...
- 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起
「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...
- 求最大公约数(更相减损术辗转相除法)
求解最大公约数的多种Way: 1 暴力解决法:M不断自减找到最大公约数. 2 辗转相除法:反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数. 3 更相减损术:若两者都为偶数,进行折半,直到 ...
- C语言 用更相减损术求最大公约数,最小公倍数
更相减损术 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. 出处 <九章算术> 用途 求最大公约数 作用 ...
最新文章
- 分布式项目启动时报错:Duplicate spring bean id XXX
- leetcode 521. 最长特殊序列 Ⅰ(Java)
- netty系列之:中国加油
- poj 3436 (最大流)
- Dubbo zookeeper 初探【转】
- CSRmesh Application
- Maven-Eclipse使用maven创建HelloWorld Java项目
- docker常用操作(三) docker安装maven私服
- AD域、Windows AD域管理功能大全
- 微软关闭了两种攻击途径:Office 宏、RDP 暴力破解
- unity车漆模拟ASE
- 安装MySQL——压缩包安装
- python获取编码方式_在Python中获取HTTP响应的字符集/编码的好方法
- 服务器硬盘整体ghost,GHOST备份操作系统与实现整块硬盘对拷数据还是很简单的...
- java浮点数取余数
- 爱普生打印机怎么安装使用
- python中quad_python用quad、dblquad实现一维二维积分的实例详解
- To小白,方法比努力更重要!
- 商务汇报PPT制作的七堂课-第三课:结构搭建
- Linux运维面试精选题库(一)
热门文章
- mysql schema 保存数据_在MySQL中,所有触发器的定义都保存在information_schema数据库下的()表中。_学小易找答案...
- Java中文jsp页面被转码了_JSP中文乱码问题终极解决方案
- sheel脚本 centos7环境 自动安装 zeppelin
- hadoop生态的kerberos认证系列2-hadoop
- 基于Socket的即时通信系统—CS模式(未完待续)
- 网传字节跳动开启10-7-5工作制,员工真的不需要加班?
- #五、先热热身--江恩那个看不见的正方在哪?
- 高性能服务器连接显示器花屏,Windows10 1607 1709公布:解决多显示器花屏
- DDF (Diamond Directive File)文件
- 基于遗传算法的人工智能实例之拼图游戏(python实现)