求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、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语言 用更相减损术求最大公约数,最小公倍数
更相减损术 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. 出处 <九章算术> 用途 求最大公约数 作用 ...
最新文章
- 《研磨设计模式》chap18 状态模式state(1)模式简介
- win64环境下的一些配置
- Java EE 7社区调查结果!
- 怎么把html表复制到word里,怎么把网页表格复制到word
- Libreoffice实现office转pdf、html、jpg等格式数据
- Detectron2和MMDetection的学习笔记
- android 拖动按钮
- Trufun Kant Studio 2008面向VS.NET的开发应用
- HDOJ 5091 Beam Cannon 扫描线
- 35岁-59岁-人生的二个世界
- 微信终于能注册小号了,无需绑定手机号!
- oel 7.0 安装 mysql 5_MySQL 5.7.21 在 OEL6.9 平台上的二进制安装
- supp(),支持集理解
- Sator提供其Orca流动性池的六周,增长更新一览
- mc服务器常用指令_MC玩家必看常用指令大全
- 一文详解 m3u8视频格式与视频秒开优化
- 计算机通电后 不能正常启动,我的电脑通电后不能马上启动?为什么啊?怎么办
- Word图片显示不全解决
- 16.为什么进行抓包测试
- Linux常用文本编辑器,及文本查看摘选的常用命令