求解最大公约数和最小公倍数

简介: 求解最大公约数和最小公倍数

求最大公约数


最大公约数的定义:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。例: 在2、4、6中,2就是2,4,6的最大公约数。


 知道了最大公约数的定义后,我们来学习一下最大公约数的求解方法。


1.暴力求解法


 思路:假设有两个数m和n,先求出两个数中的较小值min,然后利用while循环找出m和n的最大公约数。while循环的循环体是如果m和n整除min同时为零,那么此时的min就是m和n的最大公约数;不符合该条件的话min自减一。


代码实现:


#include <stdio.h>
int main()
{
  int m, n;
  printf("请输入两个整数:>");
  scanf("%d %d", &m, &n);
  int min = (m < n ? m : n);
  while (1)
  {
    if ((m % min == 0) && (n % min == 0))
    {
      break;
    }
    min--;
  }
  printf("%d和%d的最大公约数是%d\n", m, n, min);
  return 0;
}


输出结果:

463a27e9676b4a11b71674ef3b4bd509.png


2. 辗转相除法


辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公约数的算法。它是已知最古老的算法, 其可追溯至公元前300年前。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。


代码实现:


#include <stdio.h>
int main()
{
  int m, n;
  printf("请输入两个整数:>");
  scanf("%d %d", &m, &n);
  int m1 = m;
  int n1 = n;//保存m和n的数据
  int r = 0;
  while (r = m % n)
  {
    m = n;
    n = r;
  }
  printf("%d和%d的最大公约数是%d\n", m1, n1, n);
  return 0;
}

d05003b32932475b81a04751a064dde8.png


输出结果:

6e789ebe18584b73bfd699d91871b016.png


求最小公倍数


  最小公倍数的定义:如果一个数既是a又是b的倍数,那么我们就把这个数叫着a和b的公倍数,如果这个数在a b的所有公倍数里为最小,那这个数就是最小公倍数。例如,10和20的最小公倍数是20。


1.暴力求解法


 假设有两个数m和n,先求出两个数中的最大值max,然后利用while循环找出m和n的最小公倍数。while循环的循环体是如果max整除m和n同时为零,那么此时的max就是m和n的最小公倍数;不符合该条件的话max自加一。


代码实现:


#include <stdio.h>
int main()
{
  int m, n;
  printf("请输入两个数:>");
  scanf("%d %d", &m, &n);
  int max = (m > n ? m : n);
  while (1)
  {
    if ((max % m == 0) && (max % n == 0))
    {
      break;
    }
        max++;
  }
  printf("%d和%d的最小公倍数是%d\n", m, n, max);
  return 0;
}


输出结果:

88b8b6514bb64ffdbafd2c1f99d66a93.png


2.最大公约数法


 假设有两个数m和n,且m和n的最大公约数为x、最小公倍数y,那么最小公倍数和最大公约数存在一个关系式:m * n = x * y。例如这个关系式,我们就可以实现我们的代码了。


代码实现:


#include <stdio.h>
int main()
{
  int m, n;
  printf("请输入两个数:>");
  scanf("%d %d", &m, &n);
  int m1 = m;
  int n1 = n;
  int r = 0;
  while (r = m % n)
  {
    m = n;
    n = r;
  }
  printf("%d和%d的最小公倍数是%d\n", m1, n1, m1 * n1 / n);
}


输出结果:


51cf46b7eb564273bc0aeb31d503406c.png


3.奇技淫巧


 因为最大公倍数肯定是其因素的整数倍,那么假设两个数为m和n,i等于1,其最小公倍数为k。如果m成i模除n为0,那么m*i就等于k,否则i++。


代码实现:


#include <stdio.h>
int main()
{
  int m, n;
  printf("请输入两个数:>");
  scanf("%d %d", &m, &n);
  int i = 1;
  while (m*i%n!=0)
  {
    i++;
  }
  printf("%d和%d的最小公倍数是%d\n", m, n, m*i);
  return 0;
}


输出结果:

003e3053e6c04fb9ad5ce03a6c81bed2.png


 本篇博客主要介绍了最大公约数和最小公倍数的几种常见方法。如果大家对其它的方法还感兴趣的话,可以自行查找,在这里就不在赘述了。最后,如果大家觉得有收获的话,大家可以点个赞支持一下!


结语


每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根。




相关文章
|
2月前
|
算法
求最大公约数和最小公倍数的算法
求最大公约数和最小公倍数的算法
32 0
|
9天前
|
JavaScript 前端开发 Java
最大公约数
【6月更文挑战第23天】
14 4
|
2月前
|
算法
辗转相除法求最大公约数
辗转相除法求最大公约数
|
2月前
|
算法
更相减损术求最大公约数
更相减损术求最大公约数
|
2月前
|
算法 Python
最小公倍数算法
最小公倍数算法
|
11月前
wustojc5002最大公约数
wustojc5002最大公约数
33 0
|
12月前
求最大公约数
求最大公约数
42 0
|
12月前
1207:求最大公约数问题
1207:求最大公约数问题
|
算法
求最大公约数和最小公倍数的几种算法
求最大公约数和最小公倍数的几种算法
97 0
辗转相除法 求最大公约数
辗转相除法 求最大公约数
774 0