1、编写递归函数求两个正整数 a 和 b 的最大公约数(GCD,Greatest Common
Divisor),使用Euclid算法:
1. 如果 a 除以 b 能整除,则最大公约数是 b 。
2. 否则,最大公约数等于 b 和 a%b 的最大公约数。
定理证明:
设a=kb+r,则r=a%b;
假设d是a,b的一个公约数,则有a%d=0,b%d=0
而r=a-kb,所以r%d=0.
又因为r=a%b,b%d=0
d是b,a%b的公约数也是a,b的公约数。
所以GCD(a,b)=GCD(b,a%b).
int Euclid(int a,int b)
{
if(b==0)
return a;
else Euclid(b,a%b);
}
以上是算法的递归实现,在linuxC一站式编程里面有个题目让我们用while循环来实现这个算法。
#include<stdio.h>
int main()
{
int a,b,temp1,temp2;
scanf("%d %d",&a,&b);
do
{
temp2=a%b;
if(temp2)
{
temp1=a;
a=b;
b=temp1%b;
}
}
while(temp2);
printf("%d\n",b);
return 0;
}
个人认为在这个算法中,用递归的方式比较容易实现,因为递归的时候直接传入b和a%b两个参数,不需要引入其他变量来交换a,b的值。