(1)穷举法。用t=a>b?b:a;然后使用for循环for(i=t;i>0;i--)来做。
(2)欧几里得算法,也称辗转相除法。对正整数a和b,连续进行求余运算,直到余数为0为止,此时非0的除数就是最大公约数。设r=a mod b表示a除以b的余数,若r≠0,则将b作为新的a,r作为新的b,即Gcd(a,b)=Gcd(b,r),重复a mod b 运算,直到r=0时为止,此时b为所求的最大公约数。例如,50和15的最大公约数的求解过程可表示为:Gcd(50,15)=Gcd(15,5)=Gcd(5,0)=5。
#include<stdio.h>
int Gcd(int a,int b)
{
int r = a%b;
if(r!=0)
return (r = Gcd(b,r));
else
return b;
}
int main()
{
int a,b,x;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
x=Gcd(a,b);
printf("%d与%d的最大公约数为%d\n",a,b,x);
return 0;
}
(3)递归方法。对正整数a和b,当a>b时,若a中含有与b相同的公约数,则a中去掉b后的剩余部分a-b中也含有与b相同的公约数。
#include<stdio.h>
int Gcd(int a,int b)
{
if(a>b)
return Gcd(a-b,b);
else if(a<b)
return Gcd(a,b-a);
else
return a;
}
int main()
{
int a,b,x;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
x=Gcd(a,b);
printf("%d与%d的最大公约数为%d\n",a,b,x);
return 0;
}
此外,Gcd()函数还可以使用do while语句来实现:
int Gcd(int a,int b)
{
int r;
do{
r = a%b;
a = b;
b = r;
printf("a=%d,b=%d,r=%d\n",a,b,r);
}while(r!=0);
return a;
}