辗转相除法——

辗转相除法求最大公约数的原理:

两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数。

辗转相除法求最小公倍数的原理:

两个整数分别除以最大公约数的结果相乘,再乘以最大公约数;

简化后即 两个整数相乘再乘以最小公倍数。

代码示例如下:

#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算法相关推荐

  1. PYTHON语言编写求最大公约数和最小公倍数的程序(更相减损法)

    #更相减损术求GCD.py x,y=eval(input("请输入一个整数:")) t1,t2=x,y while True:a=abs(x-y)if a==min(x,y):br ...

  2. 【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程

    欧几里得 说在前面 数论学复习 Part 6. 然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP. 计划很美啊你. P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊. 有一 ...

  3. 【C语言】辗转相除法+更相减损术+秦九韶算法

    一.辗转相除法 1.简介 辗转相除法又叫欧几里得算法. 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的: 1997 / 615 = 3 (余 152) 615 ...

  4. 欧几里得算法和更相减损术证明

    欧几里得算法 gcd(greatest common divisor) 最大公约数,指两个整数所有公共约数中最大的. 首先先上结论,求最大公约数,我们可以通过递归c=a%b,gcd(a,b)=gcd( ...

  5. C++算法:辗转相除法与更相减损术

    辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...

  6. 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...

  7. 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...

  8. 求最大公约数(更相减损术辗转相除法)

    求解最大公约数的多种Way: 1 暴力解决法:M不断自减找到最大公约数. 2 辗转相除法:反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数. 3 更相减损术:若两者都为偶数,进行折半,直到 ...

  9. C语言 用更相减损术求最大公约数,最小公倍数

    更相减损术 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. 出处 <九章算术> 用途 求最大公约数 作用 ...

最新文章

  1. 《研磨设计模式》chap18 状态模式state(1)模式简介
  2. win64环境下的一些配置
  3. Java EE 7社区调查结果!
  4. 怎么把html表复制到word里,怎么把网页表格复制到word
  5. Libreoffice实现office转pdf、html、jpg等格式数据
  6. Detectron2和MMDetection的学习笔记
  7. android 拖动按钮
  8. Trufun Kant Studio 2008面向VS.NET的开发应用
  9. HDOJ 5091 Beam Cannon 扫描线
  10. 35岁-59岁-人生的二个世界
  11. 微信终于能注册小号了,无需绑定手机号!
  12. oel 7.0 安装 mysql 5_MySQL 5.7.21 在 OEL6.9 平台上的二进制安装
  13. supp(),支持集理解
  14. Sator提供其Orca流动性池的六周,增长更新一览
  15. mc服务器常用指令_MC玩家必看常用指令大全
  16. 一文详解 m3u8视频格式与视频秒开优化
  17. 计算机通电后 不能正常启动,我的电脑通电后不能马上启动?为什么啊?怎么办
  18. Word图片显示不全解决
  19. 16.为什么进行抓包测试
  20. Linux常用文本编辑器,及文本查看摘选的常用命令

热门文章

  1. 动态扭矩传感器的选择
  2. iOS进阶开发-李文瀚-专题视频课程
  3. 4G DTU之短信收发设置
  4. 如何使用Graphics绘制图像
  5. atom遇到的问题及解决方法
  6. ArcGIS中的归一化处理(normalized)
  7. Python环境管理:Andaconda安装使用
  8. 3. Web 服务原理
  9. 中专学计算机维修,《计算机维修与网络工程》中专学历班
  10. 【全球数据】世界轮廓矢量数据