简介
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
穷举法(for循环实现)
按照从大(两个整数中较小的数)到小(到最小的整数1)的顺序求出第一个能同时整除两个整数的自然数,即为所求。
#include<stdio.h>
int main()
{
int max,min,tmp,i;
printf("请输入第一个数:");
scanf("%d",&max);
printf("请输入第二个数:");
scanf("%d",&min);
if(min>max)
{
tmp=max;
max=min;
min=tmp;
}
/*穷举法按照从大到小的顺序寻找同时满足两个除法表达式无余数的自然数,自然第一个数就是最大的公约数*/
for(i=min;i>0;i--)
{
if(max%i==0&&min%i==0)
{
printf("%d与%d的最小公倍数:%d",max,min,i);
break;
}
}
return 0;
}
输出:
辗转相除法(while循环实现)
1、原理:
欧几里德算法是用来求两个正整数最大公约数的算法。是由古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。
扩展欧几里德算法可用于RSA加密等领域。
假如需要求 18和 12两个正整数的最大公约数,用欧几里德算法,是这样进行的:
18(被除数)/12(除数)=1(商)- - - -6(余数)
12/(被除数)/6(除数)=2(商)- - - -0(余数)
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 18和 12的最大公约数 6。
2、算法描述:
- 将两个正整数存放到变量m和n中
- 求余数:用较大的m对较小的n求余,将所得余数存放到变量r中
- 判断余数是否为0:若为0,执行第五步,否则执行第四步
- 更新m和n:将n的值存放到m,将r的值存放到n中,并转向第(2)步继续循环执行
- 输出n的当前值,算法结束
3、算法流程图
4、代码:
#include<stdio.h>
int main()
{
int m,n,r;
printf("请输入第一个数:");
scanf("%d",&m);
printf("请输入第二个数:");
scanf("%d",&n);
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
printf("最大公约数是:%d\n",n);
return 0;
}
输出同上