最大公约数:公约数,亦称“公因数”。 它是指能同时整除几个整数的数 。 如果一个整数同时是几个整数的 约数 ,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。 对任意的若干个 正整数 ,1总是它们的公因数。
最小公倍数:两个或多个整数公有的倍数中,除0以外最小的一个公倍数。
1.首先我们分析发现两个数的最大公约数一定不超过两个数中的较小值,所有我们可以判断出较小的那个数,从它开始依次向下判断是否为最大公约数,是就输出,且最小公倍数为其最大公约数乘上两数不同的质因数(这里我们类似于短除法的操作)。这种依次判断的方法即列举法,也叫穷举法。
我们定义一个较小值函数求较小数,开始判断
则有如下代码:
int Min(int a,int b); //函数声明
#include<stdio.h>
int main ()
{
int num1,num2;
int num_min;
scanf("%d %d",&num1,&num2);
num_min=Min(num1,num2);
while(1) //循环判断是否为公约数
{
if(num1%num_min==0 && num2%num_min==0) //判断是就输出并且跳出循环
{
printf("%d和%d的最大公约数是%d\n",num1,num2,num_min);
printf("%d和%d的最小公倍数是%d\n",num1,num2,(num1*num2/num_min));
break;
}
else //不是就判断下一个
num_min--;
}
return 0;
}
int Min(int a,int b)
{
if(a>=b)
{
return b;
}
else
{
return a;
}
}
以520和72举例,运行结果如下:
72 520
72和520的最大公约数是8
72和520的最小公倍数是4680
--------------------------------
Process exited after 6.902 seconds with return value 0
请按任意键继续. . .
2.第二种是辗转相减法,也叫更相减损法,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。 《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 翻译成现代语言如下: 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。 则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。 其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。 利用辗转相减法很快就可以得到两个数的最大公约数。
分析过程之后,实现这个代码并不难,
#include<stdio.h>
int main()
{
int a, b, t;
scanf("%d %d",&a,&b);
if (a == b) //我们这里需要单独判断是否两数相同
{
printf("最大公约数%d\n", a);
}
else //相减过程
{
while (a != b)
{
if (a > b) //意为谁大谁减
a = a - b;
else
b = b - a;
}
printf("最大公约数是%d\n", a);
}
return 0;
}
最小公倍数算法同样,这里不再写出
72 520
最大公约数是8
--------------------------------
Process exited after 2.749 seconds with return value 0
请按任意键继续. . .
3.第三种算法较难理解,叫辗转相除法,也叫做欧几里得算法,原理是高数数论中描述为:
(a,b)->(b,i),将b赋值给a,i赋值给b
[数论] 辗转相除法的本质原理和简单应用_哔哩哔哩_bilibili
字面解释模糊,这里有算法原理解释链接。(这里一定不是因为博主懒!!!咳咳)
例:假如需要求 100 和18 两个正整数的最大公约数,用欧几里得算法,是这样进行的: 100 / 18 = 5 (余 10) 18 / 10= 1(余8) 10 / 8 = 1(余2) 8 / 2 = 4 (余0) 至此,最大公约数为2 以除数和余数反复做除法运算,当余数...。。。最后除数是最大公约数,也就是b
和法2不同的是相除更为巧妙,下面看代码分析:
#include<stdio.h>
int main ()
{
int a,b,i;
scanf("%d %d",&a,&b);
while(a%b!=0) //巧妙利用循环条件,不等于0就继续相除,与辗转相除法一致
{
if(a>b) //因为不知道大小,所以判断不同情况
{ //也可以像上面调用函数的方法
i=a%b; //循环相除
a=b; //辗转过程
b=i;
}
else //这里一样
{
i=b%a;
b=a;
a=i;
}
}
printf("最大公约数是%d\n",b);
return 0;
}
意料之中,结果还是:
72 520
最大公约数是8
--------------------------------
Process exited after 3.457 seconds with return value 0
请按任意键继续. . .
最后方法当然不止这些,还有我们的分解质因数法和短除法,这两个方法原理类似,可行但效率较低,就不过多说明了,有兴趣的可以自己试试看最后我们就介绍到这里了。