辗转相除法——

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

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

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

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

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

代码示例如下:

#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. 分布式项目启动时报错:Duplicate spring bean id XXX
  2. leetcode 521. 最长特殊序列 Ⅰ(Java)
  3. netty系列之:中国加油
  4. poj 3436 (最大流)
  5. Dubbo zookeeper 初探【转】
  6. CSRmesh Application
  7. Maven-Eclipse使用maven创建HelloWorld Java项目
  8. docker常用操作(三) docker安装maven私服
  9. AD域、Windows AD域管理功能大全
  10. 微软关闭了两种攻击途径:Office 宏、RDP 暴力破解
  11. unity车漆模拟ASE
  12. 安装MySQL——压缩包安装
  13. python获取编码方式_在Python中获取HTTP响应的字符集/编码的好方法
  14. 服务器硬盘整体ghost,GHOST备份操作系统与实现整块硬盘对拷数据还是很简单的...
  15. java浮点数取余数
  16. 爱普生打印机怎么安装使用
  17. python中quad_python用quad、dblquad实现一维二维积分的实例详解
  18. To小白,方法比努力更重要!
  19. 商务汇报PPT制作的七堂课-第三课:结构搭建
  20. Linux运维面试精选题库(一)

热门文章

  1. mysql schema 保存数据_在MySQL中,所有触发器的定义都保存在information_schema数据库下的()表中。_学小易找答案...
  2. Java中文jsp页面被转码了_JSP中文乱码问题终极解决方案
  3. sheel脚本 centos7环境 自动安装 zeppelin
  4. hadoop生态的kerberos认证系列2-hadoop
  5. 基于Socket的即时通信系统—CS模式(未完待续)
  6. 网传字节跳动开启10-7-5工作制,员工真的不需要加班?
  7. #五、先热热身--江恩那个看不见的正方在哪?
  8. 高性能服务器连接显示器花屏,Windows10 1607 1709公布:解决多显示器花屏
  9. DDF (Diamond Directive File)文件
  10. 基于遗传算法的人工智能实例之拼图游戏(python实现)