1.穷举法
输入 a,b两个数字,比如a>b,就从2到b,挨个试,如果是公约数就赋值给k,因为是从小到大的穷举数字,所以最后赋值给k的数字一定是最大的公约数。
#include<stdio.h>
int main ()
{
int a,b,c,i,k;
scanf("%d %d",&a,&b);
c=a>b?b:a;
for(i=2;i<=c;i++)
{
if(a%i==0&&b%i==0)
k=i;
}
printf("%d",k);
return 0;
}
2.辗转相除法
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
用较大数除以较小数,再用出现的余数去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后为0,则除数为最大公约数。
比如求18与30的最大公约数
30÷18=1....12
18÷12=1....6
12÷6=2.....0
所以6为最大公约数
#include<stdio.h>
int main()
{
int a, b,t;
scanf("%d %d", &a, &b);
while (a%b!=0)
{
t = b;//存上一轮的除数
b = a % b;//这一轮的余数做下一轮的除数
a = t;//做下一轮的被除数
}
printf("%d", b);//最后剩下的除数就是答案
return 0;
}
3.更相减损法
用两个数中较大数x减去较小数y,如果差z等于0,那么最大公约数为x,如果不等于0,则将y的值给x,y的值给z,继续相减直到差为0,此时最大公约数为x。
#include<stdio.h>
int main ()
{
int a,b,c=1;
int x,y,z=1;
scanf("%d %d",&a,&b);
if(a>b) //找出a,b中较大的数
{
x=a;
y=b;
}
else{
x=b;
y=a;
}
while(z!=0)
{
z=x-y;
x=y;
y=z;
}
printf("%d",x);
return 0;
}