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

该代码的视频讲解

【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. 阎崇年:《袁崇焕传》自序
  2. AngularJs快速上手掌握
  3. 基于BERT模型的文本分类研究 TensorFlow2实现(内附源码)【自然语言处理NLP-100例】
  4. Centos常用快捷键
  5. 提高页面显示速度的秘技
  6. 超文本传输协议及HTTP包
  7. 编辑视频贴纸软件_视频特效编辑软件下载-视频特效编辑器下载V10.9.93-西西软件下载...
  8. oform java_客户端表单通用验证checkForm(oForm)(1)
  9. 如何运用大数据进行信贷审批?
  10. CheckBox jsp+javaScript多项选择checkbox取值实现
  11. MFC中编辑框edit的用法
  12. python从数据库中取出文件保存到excel,csv表格中的办法:
  13. React-Native 双平台应用的测试发布和 CodePush 热更新部署
  14. Cisco路由器配置命令
  15. rational rose导出sql脚本
  16. 大雪满弓刀之林冲 [转]
  17. 电影TS/TC/SCR/R5/BD/HD/HC版本意思收集(转)
  18. 一文带你了解Serverless架构及应用场景
  19. VS 2022 中英文切换
  20. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

热门文章

  1. 【python】《多媒体技术与应用》实验报告「数字图像压缩」「傅里叶变换」
  2. 软件测试的自动化调试工具,DT10自动化的软件测试及调试工具
  3. ftp文件夹错误,找不到元素
  4. websocket 心跳机制
  5. stream游戏linux,stream
  6. 基于队列和哈希的种子填充算法
  7. 基于java GUI实现的一个日历记事本小项目
  8. android 12306反编译,Android开发(七)| “我的12306”实例
  9. idea重复代码有下划波浪线
  10. 【第三方库】PHP实现创建PDF文件和编辑PDF文件