欧几里得算法:两数 a, b 的最大公约数等于 较小数与两数余数的最大公约数。
gcd(a, b) = gcd(b, a % b)
前提: a > b && a % b != 0 && a,b ∈N*
证明:
设 x 同时被 a, b 整除,即 x|a, x|b;
设 r = a %b, 则 a =kb + r (r, , ∈ N*)
两边同除以x, 得
a/x = k*b/x + r/x
因为x|a, x|(k*b)所以x|r,即x|(a%b)
所以a,b的最大公约数等于b与a%b的最大公约数。
证明过程参考百度百科。欧几里得算法_百度百科 (baidu.com)
/*************************************************************************
> File Name: getMaxCommonFactor.c
> Author:zhangji
> Mail:mrzhangji@outlook.com
> Created Time: Mon 02 Oct 2023 08:02:35 AM CST
************************************************************************/
#include<stdio.h>
int gcd(int a, int b){
if(a % b == 0) return b;
else return gcd(b, a % b);
}
int getMaxCommonFactor(int a, int b){
if(a < b){ // a<b, 交换a,b
a = a ^ b;
b = b ^ a;
a = a ^ b;
}
if ( a % b == 0 ) return b;
return gcd(a, b);
}
int main(){
int a,b;
scanf("%d%d", &a, &b);
int maxCommonFactor = getMaxCommonFactor(a, b);
printf("%d\n", maxCommonFactor);
return 0;
}