下面总共介绍了四种最大公约数的求解方法和一个最小公倍数的求解方法

该代码的视频讲解

【300题刷题挑战】leetcode力扣 最大公约数和最小公倍数的多种解法 GCDandLCM第八十三题 | 数学方法

视频页跳转链接

代码:

public class GCDandLCM_multiple {/*** 最大公约数和最小公倍数的多种解法*/public static void main(String[] args) {int a = 18, b = 12;GCDandLCM_multiple gcDandLCM_multiple = new GCDandLCM_multiple();System.out.println("============================== 最大公约数 ==============================");System.out.println("方法一 暴力穷举法   关于 a = "+ a +", b = "+ b +"的最大公约数为:" + gcDandLCM_multiple.gcd_enumeration(a, b));System.out.println("方法二 写法一 辗转相除法的递归写法   关于 a = "+ a +", b = "+ b +"的最大公约数为:" + gcDandLCM_multiple.gcd_division_recursive(a, b));System.out.println("方法二 写法二 辗转相除法的迭代写法   关于 a = "+ a +", b = "+ b +"的最大公约数为:" + gcDandLCM_multiple.gcd_division_iteration(a, b));System.out.println("方法三 写法一 辗转相减法(尼考曼彻斯法)  关于 a = "+ a +", b = "+ b +"的最大公约数为:" + gcDandLCM_multiple.gcd_substract_recursive(a, b));System.out.println("方法三 写法二 辗转相减法(尼考曼彻斯法)  关于 a = "+ a +", b = "+ b +"的最大公约数为:" + gcDandLCM_multiple.gcd_substract_iteration(a, b));System.out.println("方法四  使用位操作和减法   关于 a = "+ a +", b = "+ b +"的最大公约数为:" + gcDandLCM_multiple.gcd_shift_substract(a, b));System.out.println("============================== 最小公倍数 ==============================");System.out.println("关于 a = "+ a +", b = "+ b +"的最小公倍数为:" + gcDandLCM_multiple.lcm(a, b));}// 首先时求最大公约数(最大公因数)// 方法一 暴力穷举法求两个数的最大公约数private int gcd_enumeration(int a, int b) {// 比较a和b,找到a,b中较小的那个数,减少for循环次数,// 因为最大公约数是一定不大于a,b中更小的那个的(整数拆分后只能是更小的整数)int smaller = a;if(b < a) {smaller = b;}int gcd = 1;for(int i = 2; i <= smaller; ++i) {if(a % i == 0 && b % i == 0) {gcd = i;}}return gcd;}// 方法二 写法一 辗转相除法的递归写法private int gcd_division_recursive(int a, int b) {return b == 0 ? a : gcd_division_recursive(b, a % b);}// 方法二 写法二 辗转相除法的迭代写法private int gcd_division_iteration(int a, int b) {// 判断条件之所以是b,是因为我们这里用b来接收a % b 的结果,即上一步算法下来的余数// 余数为零时,我们就找到了结果while(b != 0) {int temp = b;b = a % b;a = temp;}return a;}// 方法三 辗转相减法(尼考曼彻斯法)// 算法步骤:// 若a > b,则a = a - b// 若b > a,则b = b - a// 若a == b,则a(或b)即为最大公约数// 若a != b,则回到1// 例子// 求32,12的最大公约数://   32 - 12 = 20 (20 > 12)//   20 - 12 = 8 (8 < 12)//   12 - 8 = 4 (4 < 8)//   8 - 4 = 4 (4 == 4)// 所以最大公约数是4// 方法三 辗转相减法(尼考曼彻斯法)递归写法private int gcd_substract_recursive(int a, int b) {if(a == b) {return a;} else if(a > b) {return gcd_substract_recursive(a - b, b);} else {return gcd_substract_recursive(a, b - a);}}// 方法三 辗转相减法(尼考曼彻斯法)迭代写法private int gcd_substract_iteration(int a, int b) {// 如果a,b不相等,则用大的数减去小的数,直到相等为止while(a != b) {if(a > b) {a = a - b;} else {b = b - a;}}return a;}// 方法四  使用位操作和减法求解最大公约数// 首先对于位运算,我们是对我们常用十进制数转为二进制数之后做的位置移动的运算// 运算符叫双目移动运算符(左移 << ,右移 >>)// 所以对于乘 2 和除 2 操作我们都可以转换为移位操作// 本方法算法思路// 对于 a 和 b 的最大公约数 f(a, b),有://// 如果 a 和 b 均为偶数,f(a, b) = 2*f(a/2, b/2);// 如果 a 是偶数 b 是奇数,f(a, b) = f(a/2, b);// 如果 b 是偶数 a 是奇数,f(a, b) = f(a, b/2);// 如果 a 和 b 均为奇数,f(a, b) = f(b, a-b);private int gcd_shift_substract(int a, int b) {// 还是首先要保证传进来的两个参数中,第一个参数a要比b大,否则交换位置if(a < b) {return gcd_shift_substract(b, a);}if(b == 0) {return a;}if(isEven(a) && isEven(b)) {return 2 * gcd_shift_substract(a >> 1, b >> 1);} else if(isEven(a) && !isEven(b)) {return gcd_shift_substract(a >> 1, b);} else if(!isEven(a) && isEven(b)) {return gcd_shift_substract(a, b >> 1);} else  {return gcd_shift_substract(b, a - b);}}// 是否为偶数判断private boolean isEven(int x) {if(x % 2 == 0) {return true;}return false;}// 顺带记住一个公式求最小公倍数,方法不做展开// 算法思路// 两个数的最小公倍数 等于 两数之积除以他们的最大公约数// lcm(a, b) = (a * b) / lcd(a, b)private int lcm(int a, int b) {return (a * b) / gcd_shift_substract(a, b);}
}

最大公约数(gcd)和最小公倍数(lcm)的多种解法 Java 实现相关推荐

  1. Problem B: 编写函数:求最大公约数gcd()和最小公倍数lcm() (Append Code) 山东科技大学 oj

    题目描述 辗转相除法,也称欧几里得算法,是求最大公约数的算法.辗转相除法首次出现于欧几里得的<几何原本>(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的<九章算术> ...

  2. 最大公约数GCD与最小公倍数LCM

    一.最大公约数(GCD)    最大公约数的递归:1.若a可以整除b,则最大公约数是b 2.如果1不成立,最大公约数便是b与a%b的最大公约数. 辗转相除法. 1.欧几里得算法(辗转相除法) int ...

  3. C语言求二个数的最大公约数gcd和最小公倍数lcm(附完整源码)

    求二个数的最大公约数和最小公倍数 实现以下接口 实现卡最大公约数和最小公倍数完整源码(定义,实现,main函数测试) 实现以下接口 int gcd(int a, int b);//求最大公约数 int ...

  4. Python最大公约数gcd、最小公倍数lcm

    1. 最大公约数 最大公约数(Greatest Common Divisor)缩写为GCD 这里求最大公约数的方法为辗转相除法 a, b = map(int, input('请输入两个数字,其间用空格 ...

  5. ACM数论之旅3---最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄∀ ̄))...

    gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm     ( gcd就是gcd(a, b), ( •̀∀•́ ) ...

  6. leetcode 592. Fraction Addition and Subtraction | 592. 分数加减运算(最大公因数gcd,最小公倍数lcm)

    题目 https://leetcode.com/problems/fraction-addition-and-subtraction/ 题解 这题既简单又麻烦,一道 hard 的 easy 题,被划分 ...

  7. 离散数学/初等数论:用“质因子分解法”和“欧几里得算法”求最大公约数gcd;“质因子分解法”和“最简算法”求最小公倍数lcm;以及对“意义”的一些看法。

    需要在开头提前说明,本篇文章仅仅用于在学习初等数论或者离散数学时候对算术基本定理的理解,实际应用的时候把结论告诉大家,想求最大公约数就用欧几里得算法是最简单的,在本篇不再赘述,有机会我会在其他文章中说 ...

  8. 51Nod-1012 最小公倍数LCM【欧几里得算法】

    1012 最小公倍数LCM 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入2个正整数A,B,求A与B的最小公倍数. Input 2个数A,B,中间用空格隔开.(1& ...

  9. 计算最小公倍数LCM

    Lowest Common Multiple(LCM) 这是数论算法中的基础算法程序. 基于非递归的欧几里得算法(计算最大公约数GCD算法)来求解最小公倍数. /** 计算最小公倍数(Lowest C ...

最新文章

  1. 30 段极简 Python 代码:这些小技巧你都 Get 了么?
  2. Linux下Minigui开发环境的搭建(PC+S3C2440
  3. Win10驱动签名总结
  4. IPD开发流程TR1-TR6各个阶段简介
  5. 【前端】日期正则表达式(转发)
  6. Jupyter Notebook 工作环境配置
  7. Matlab的eval函数
  8. 而立之年——那些从一线城市退到二三线的程序员,现在过的怎么样了?
  9. 游戏党福音,Google play游戏明年登录Windows
  10. MCDF-lab4中部分代码理解
  11. 简单的酒店住房退房管理系统
  12. 动态路由协议RIP的深层配置学习
  13. 搭建基于DataX的可视化界面
  14. 7-3 航空公司VIP客户查询 (25 分)C语言实现
  15. 高中计算机高效课堂和有效教学模式论文,高效课堂论文范文
  16. Java中将网页html转图片
  17. 游戏开发需要了解哪些背景知识?
  18. elementui修改checkbox样式
  19. 第一部分 思科九年 一(4)
  20. java一卡通管理系统实现_基于jsp的校园一卡通管理系统

热门文章

  1. 房地产数字化转型方案:全方位数智化系统运营,助力房企管控实效提升
  2. 代数结构、半群与群——定义与性质
  3. c语言写的黑白棋游戏代码,C语言编写的黑白棋游戏源代码..doc
  4. 百度不收录怎么办?教大家五个简单办法
  5. 安装 vSphere Client 5.0 失败显示错误:此产品只能安装在 Win XP SP2 及更高版本上...
  6. 【深入浅出 Node + React 的微服务项目】1.微服务的基本知识
  7. 脂肪填充的危害有哪些
  8. 嵌入式Linux中几种image的区别
  9. Galera Cluster for MySQL 详解(四)——性能测试
  10. linux下的cpu温度监控软件 lm-sensors