成仙之路−> 算法基础课题解
欧几里德算法
结论: gcd
证明:
设 a=bk+c,显然有c=a\bmod b。设 d \mid a,d\mid b,则 c=a-bk,\dfrac{c}{d}=\dfrac{a}{d}-\dfrac{b}{d}k
由右边的式子可知 \dfrac{c}{d} 为整数,即 d \mid c,所以对于 a,b 的公约数也是 b,a \bmod b 的公约数。
反过来也需要证明:
设 d \mid b,d \mid (a \bmod b),我们依旧可得式子:\dfrac{a \bmod b}{d}+\dfrac{b}{d}k=\dfrac{a}{d}
因为左边式子显然为整数,故 \dfrac{a}{d} 也为整数,即 d \mid a,所以对于 b,a \bmod b 的公约数也是 a,b 的公约数。
既然两式公约数相同,那么最大公约数也会相同。
所以得到式子: \gcd(a,b)=\gcd(b,a \bmod b)
完整代码
#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
}
return 0;
}