C语言题解——最小公倍数的三种求法(含最大公约数)

简介: 最小公倍数是指能同时将两数整除的最小倍数,而最大公约数是则是能被两数同时整除的最小因数。最小公倍数有个特点,就是最小为两数中的较大值,最大为两数的乘积;最小公倍数则是最小为1,最大为两数中较小值(如果两数相同,那么最大公约数、最小公倍数是它们本身)🎉🎉🎉

🏆前言


 最小公倍数是指能同时将两数整除的最小倍数,而最大公约数是则是能被两数同时整除的最小因数。最小公倍数有个特点,就是最小为两数中的较大值,最大为两数的乘积;最小公倍数则是最小为1,最大为两数中较小值(如果两数相同,那么最大公约数、最小公倍数是它们本身)🎉🎉🎉



 简单了解这些基本知识后我们就可以进行求解了,求解的过程也很简单,中学数学足够了。


🏆正文


本文只介绍三种题解方法(其中一种解最大公约数还有问题),多理解记忆就能掌握。


🏃1.暴力试除法


暴力试除法指在范围内一个数一个数的试,如果找到符合条件的数,停止寻找即可,像这种逐个测试的方法一般称为穷举,缺点是慢,优点是数据不容易出错。


f990c8bf76bc05b8fd5791a7cfab167.png

//1.暴力试除法
#include<stdio.h>
int the_max(int a, int b)
{   //获取两数中的较大数
  return a > b ? a : b;
}
int the_min(int a, int b)
{   //获取两数中的较小数
  return a < b ? a : b;
}
int main()
{
  int a = 0;
  int b = 0;
  printf("请输入两个数字:>");
  scanf("%d %d", &a, &b);
  //先求最小公倍数
  int min = the_max(a,b);//定义变量存储
  for (; min <= a * b; min++)
  {
    if (min % a == 0 && min % b == 0)
      break;
  }
  printf("%d %d两数的最小公倍数为%d\n", a, b, min);
  //最大公约数,原理基本相同
  int max = the_min(a, b);//定义变量存储
  for (; max > 0; max--)
  {
    if (a % max == 0 && b % max == 0)
      break;
  }
  printf("%d %d两数的最大公约数为%d\n", a, b, max);
  return 0;
}//暴力试除法,效率较低

暴力试除法过于暴力,纯属是以时间换效率,如果想要高效率,这种方法肯定是不可取的!

🏃‍♂️2.优雅试除法


优雅试除法不同于暴力试除法,它采用倍数的巧妙关系,绕过了很多无意义的循环,从而提升了效率。求最小公倍数时扩大倍数没问题,但求最大公约数时会存在一些问题,我已经做了一些优化,但在某些数据上这种方法求最大公约数还是有问题!

800d2c2cd39fa392bb137b5d81c242f.png

//2.优雅试除法_效率更高
//经过测试,这种方法虽然优雅
//但在求最大公约数时可能会出错
//比如 2048与408,其他方法是8,而这是16!
//没有最优的方法,只有最灵活的方法!!!
#include<stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  printf("请输入两个数字:>");
  scanf("%d %d", &a, &b);
  int ret = 1;//效率提高的关键变量
  while ((a * ret) % b)
    ret++;
  printf("%d %d两数的最小公倍数为%d\n", a, b, a*ret);
  int tmp = 1;//同样是重要变量
  //测试发现,当先输入奇数,再输入偶数时会出错
  //以及都是偶数时,前数字较大会出错
  //原因:没有确定大值与小值
  int min = a < b ? a : b;//找出较小值
  int max = a > b ? a : b;//找出较大值
  while (max%(min/tmp))
    tmp++;
  printf("%d %d两数的最大公约数为%d\n", a, b, min / tmp);
  return 0;
}

优雅试除法求最小公倍数完全没有问题!但求最大公约数要慎重,有用的方法才是好方法!

🏃‍♀️3.辗转相除法(欧几里得算法)


欧几里得,数学大佬 ,琢磨出来辗转相除求最大公约数这个巧妙方法,具体的数学原理我们不必去研究,只需要知道如何用C语言翻译就行了。

9009fd591c62c02ec07ae57604f055d.png

e76033b272dea3a7d1b04880dd5a669.png

//3.辗转相除法(欧几里得算法)
#include<stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  printf("请输入两个数字:>");
  scanf("%d %d", &a, &b);
  int a1 = a;//辗转相除会改变值
  int b1 = b;//因此需要替身
  int tmp = 0;
  while (b1)
  {
    //辗转相处求出最大公约数
    tmp = a1 % b1;
    a1 = b1;
    b1 = tmp;
    //此时a1就是最大公约数
  }
  // a * b / a1 = 最小公倍数
  printf("%d %d两数的最小公倍数为%d\n", a,b,a*b/a1);
  printf("%d %d两数的最大公约数为%d\n", a, b, a1);
  return 0;
}


辗转相除法非常好用!欧几里得是真的强,将效率提供升到了一个新的高度。理解了这种算法,以后求最大公约数和最小公倍数简直是信手拈来,十分轻松!


🏆总结


 最小公倍数与最大公约数是C语言学习前期十分合适的算法,逻辑比较简单,代码量也很小,只需要使用分支与循环语句,做好条件判断,程序还是很好写出来的。关于其他解法可以去看看别的博主的文章,找到适合自己的求解方法,就像语言一样,没有最好的,只有最合适的!🎊🎊🎊


 如果你觉得本文写的还不错的话,期待留下一个小小的赞👍,你的支持是我分享的最大动力!


 如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正!


网络异常,图片无法展示
|

目录
相关文章
|
9月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
323 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
|
9月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
220 18
|
9月前
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】判断一个数是不是5和7的倍数(头歌实践教学平台习题)【合集】
本任务要求输入一个正整数,判断其是否同时是5和7的倍数,若是输出&quot;Yes&quot;,否则输出&quot;No&quot;。内容涵盖选择结构的基本概念、主要语句类型(if、if-else、switch)及条件判断逻辑,帮助理解编程中的分支执行与条件表达式。测试用例包括正数、负数及非倍数情况,确保代码逻辑严谨。通关代码示例如下: ```cpp #include &quot;stdio.h&quot; int main(){ int a; scanf(&quot;%d&quot;, &a); if (a &lt;= 0){ printf(&quo
273 0
|
存储 安全 C语言
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
【C语言刷题每日一题】——求最大公约数(带数学计算过程详解)
|
C语言 Windows
C语言素数的不同求法
C|素数的不同求法及在线测试比较
|
C语言
C语言---最大公约数和最小公倍数的求法
C语言---最大公约数和最小公倍数的求法
189 0
|
算法 C语言
C语言——最大公因数和最小公倍数
C语言——最大公因数和最小公倍数
716 0
C语言每日一练——Day02:求最小公倍数(3种方法)
C语言每日一练——Day02:求最小公倍数(3种方法)
C语言每日一练——Day01:求最大公约数(三种方法)
C语言每日一练——Day01:求最大公约数(三种方法)
|
算法 C语言 机器学习/深度学习