在使用欧几里德算法计算两个数的最大公约数时,有两种实现形式,一种是迭代相除,另一种是递归。它们都依赖于一个定理:gcd(a,b) = gcd(b,a mod b)。
下面对这个定理做证明:
1、当a<b时,a mod b = a,gcd(a,b) = gcd(b,a mod b) = gcd(b,a),定理成立。
2、当a>b时,设a = kb+r,r = a mod b。
若 d是a,b的公约数,则a mod d = 0, b mod d = 0, 因为r = a-kb,所以r mod d = (a-kb) mod d=0,因此d也是r的约数,由此可得,若d是a,b的公约数,则d是b, a mod b的公约数。
若d是b, a mod b的公约数,a = kb+r = kb+(a mod b),a mod d = [kb+(a mod b)] mod d = 0,所以d也是a的约数。
由以上可得(a,b)和(b,a mod b)拥有相同的公约数,因此拥有相同的最大公约数。
算法实现:
#include <stdio.h>
#include <stdlib.h>
//求两个数的最大公约数
int gcd(int a,int b){
int temp;
while(b!=0){
temp = a;
a = b;
b = temp%b;
}
return a;
}
//求两个数的最大公约数,递归实现形式
int gcd_recursive(int a,int b){
if(b==0){
return a;
}
return gcd_recursive(b,a%b);
}
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
printf("%d\n",gcd(a,b));
printf("%d\n",gcd_recursive(a,b));
}
return EXIT_SUCCESS;
}
如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。
0是任何非零整数的倍数。