最大公约数(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;
}
标签:公倍数,自然数,最小,求取,int,最大公约数
From: https://www.cnblogs.com/XG-madman/p/18151280