辗转相除法的递归写法为:
#include <stdio.h>
#include <stdlib.h>
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("Greatest common divisor: %d",gcd(a,b));
return 0;
}
其中,
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
为核心代码 即gcd(a,b)=gcd(b,a%b)
证明如下:
设a=nx,b=mx,其中m,n互质;
不妨先证明gcd(a,b)=gcd(b,a-b)
则a-b=(n-m)x;
问题变为证明a与a-b互质,其中a与b互质;
假设a与a-b不互质,且最大公约数为k
则a=ok,a-b=pk
反解得:b=(o-p)k
由于a,b互质,则k等于1,与前相悖
所以假设不成立
所以a与a-b互质
所以gcd(a,b)=gcd(b,a-b)
引申得gcd(a,b)=gcd(b,a%b)
证毕。