原理
-
又可被称为辗转相除法。
-
原理:用(a, b)表示a和b的最大公约数。则
(a, b) = (b, a % b)
,下面是对该式的证明:a % b = a - c*b
,其中c为 $\lfloor \frac{a}{b} \rfloor$。 -
则需要证明:
(a, b) = (b, a - c*b)
。假设d是a和b的约数,则d|a
,d|b
,所以d|a - c*b
;假设d|b
,d|a - c*b
,则d|a - c*b + c*b
,即d|a
,所以式子两边的约数都一样,因此最大公约数也一样。
代码
#include <iostream>
using namespace std;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", gcd(a, b));
}
return 0;
}