【手把手带你刷好题】—— 32.求最大公约数+求最小公倍数

举报
安然无虞 发表于 2022/05/26 23:32:54 2022/05/26
【摘要】 目录 原题一:求最大公约数 方法一:暴力求解 方法二:辗转相除法(很重要哦) 原题二:最小公倍数 方法一:暴力求解 方法二:利用最大公约数 结语 【前言】 今天是刷题打卡第32天! 加油吧少年。 原题一:求最大公约数 方法一:暴力求解 思路: 举一个例子,比如求24和18的最大公约数,它...

目录

原题一:求最大公约数

方法一:暴力求解

方法二:辗转相除法(很重要哦)

原题二:最小公倍数

方法一:暴力求解

方法二:利用最大公约数

结语

【前言】

今天是刷题打卡第32天!

加油吧少年。

原题一:求最大公约数

方法一:暴力求解

思路:

举一个例子,比如求24和18的最大公约数,它再大,也不可能比18还大,所以先假设最大公约数是18,看18能不能把24和18都整除掉,不能的话就减一,最后就能得到答案,emmm,这个方法很暴力,效率很低,大家简单看一下就行了。

代码执行:


  
  1. //方法一:暴力求解法
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int m = 0;
  6. int n = 0;
  7. scanf("%d %d", &m, &n);
  8. //求m和n的较小值,假设较小值就是最大公约数
  9. int ret = (m < n) ? (m) : (n);
  10. while (1)
  11. {
  12. if ((m % ret == 0) && (n % ret == 0))
  13. {
  14. break;
  15. }
  16. ret--;
  17. }
  18. printf("%d\n", ret);
  19. return 0;
  20. }

方法二:辗转相除法(很重要哦)

怎么说呢,当余数等于0的时候,除数就是最大公约数 。有个好处就是不需要判断M和N的大小!


  
  1. //方法二:辗转相除法
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int m = 0;
  6. int n = 0;
  7. scanf("%d %d", &m, &n);
  8. int ret = 0;
  9. while (ret = m % n)
  10. {
  11. m = n;
  12. n = ret;
  13. }
  14. printf("%d\n", n);
  15. return 0;
  16. }

递归实现辗转相除法:


  
  1. //辗转相除法(递归写法)
  2. #include<stdio.h>
  3. int gcd(int m, int n)
  4. {
  5. if (n == 0)
  6. return m;
  7. return gcd(n, m % n);
  8. }
  9. int main()
  10. {
  11. int m = 0;
  12. int n = 0;
  13. scanf("%d %d", &m, &n);
  14. int ret = gcd(m, n);
  15. printf("%d\n", ret);
  16. return 0;
  17. }

原题二:最小公倍数

方法一:暴力求解

思路:

举一个例子,比如求24和18的最小公倍数,它再小,也不可能比24还小,所以先假设最小公倍数是24,看24和18能不能把24整除掉,不能的话就加一,最后就能得到答案,emmm,这个方法很暴力,效率很低,大家简单看一下就行了。

代码执行:


  
  1. //方法一:暴力求解法
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int m = 0;
  6. int n = 0;
  7. scanf("%d %d", &m, &n);
  8. int ret = (m > n) ? (m) : (n);
  9. while (1)
  10. {
  11. if ((ret % m == 0) && (ret % n == 0))
  12. {
  13. break;
  14. }
  15. ret++;
  16. }
  17. printf("%d\n", ret);
  18. return 0;
  19. }

方法二:利用最大公约数

思路:

假如两个数m和n,最大公约数为a,最小公倍数 == m * n / a

代码执行:


  
  1. //方法二:利用最大公约数
  2. #include<stdio.h>
  3. int gcd(int m, int n)
  4. {
  5. //找递归边界
  6. if (n == 0)
  7. return m;
  8. return gcd(n, m % n);
  9. }
  10. int main()
  11. {
  12. int m = 0;
  13. int n = 0;
  14. scanf("%d %d", &m, &n);
  15. int ret = gcd(m, n);//最大公约数
  16. int s = m * n;
  17. printf("%d\n", s / ret);
  18. return 0;
  19. }

结语

今天是刷题打卡第32天!

加油吧少年。

 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121598355

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。