最大公约数和最小公倍数

最大公约数(GCD)和最小公倍数(LCM)

最大公约数定义 :

             如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数;
             几个自然数公有的约数,叫做这几个自然数的公约数;
             公约数中最大的一个公约数,称为这几个自然数的最大公约数(greatest common divisor,简写为gcd)

最小公倍数定义 :

             简单介绍,两个数共有的倍数中最小的数,例如2和3的公倍数有6,12,18,24...最小公倍数为6;
             在这里我们重点体现最大公约数和最小公倍数(lcm)关系:最小公倍数=两数的乘积/最大公约数

取余(c语言中):

             也就是求余数,使用的运算符是 %。C 语言中的取余运算只能针对整数,
             也就是说,% 的两边都必须是整数,不能是小数。
             另外,余数可以是正数也可以是负数,由 % 左边的整数决定:
             1.如果 % 左边是正数,那么余数也是正数;
             2.如果 % 左边是负数,那么余数也是负数;

while循环实现辗转相除法求取两个整数的最大公约数;

             而你,我的朋友,当你在尝试理解这个代码时,你应该会思考a和b的大小关系,要是a<b呢?
			   
             我们受惯性思维影响,印象中两个数取余,那么被除数应该大于除数,
             因为被除数小于除数的话,那么余数就是除数,好像取了个寂寞
			   
             当a<b时,我们可以发现第一次while循环之后,a和b交换了位置,
             此时a>b,我们就无需担心我们输入的两个整数是什么关系,无需比较两个数的大小。

利用最大公约数求取最小公倍数;

             这里我们还以两个整数a,b为例:  利用公式:最小公倍数=两数的乘积/最大公约数

             在这里我们先用函数递归求取最大公倍数,然后再用上述公式求取最小公倍数
             递归函数求取时就要考虑a和b的大小关系了;这里我们假设a>b...
             当然我们也可以先判断两个数的大小,如果a<b,那么我们交换a和b的位置,然后再进行递归...
			 
          (不要问我为什么不在whlie循环已经求取最大公约数的基础上写一个函数求取最小公倍数,因为我不会,是的,我不会...
	    在这里还希望有大佬指导一下如何在一个程序里利用whlie和公式求取最小公倍数,我借此机会学习,感激不尽!!)
代码
#include <stdio.h>

int GCD(int a,int b,int g) //while循环求取最大公约数
{
  while (g=a%b)
  {
       a=b;
       b=g;
  }
  return b;
}
/*    
int GCD (int a, int b)    //函数递归求取最大公约数
{
  int m;

	if(a<b)
 {
   m=a;
   a=b;
   b=m;
 }  
  
  if (b == 0)
  {
    return a;
  }	
	 else
	{
		return GCD(b, a % b);
	}
}
*/
int main(int argc, char const *argv[])
{
    int a,b,g;
     
    printf("请输入两个数字:");
    scanf("%d %d",&a,&b);

    printf("最大公约数为%d\n",GCD(a,b,g));

    //printf("最小公倍数为%d\n",  a * b / GCD(a,b)   ); //利用递归和公式:最小公倍数=两数的乘积/最大公约数求取最小公倍数

    return 0;
}
posted @ 2024-04-22 19:48  madman_LX  阅读(147)  评论(1)    收藏  举报