#include
#include
using namespace std;
// 欧几里得算法证明
/*
设 gcd(a,b)=c a和b 的最大公约数 是c
k是一个整数集
求证:gcd(a,b)=gcd(b,a%b)
(1) 设 r=a%b a=mc b=nc (m和n 为互质的整数 )
因为 r=a%b =a-k1*b (k1,k2,k3,k4都是整数)
所以 r=a%b=m*c-k1*n*c=(m-k1*n)c
由上式可知
b=n*c
r=(m-k1*n)*c
若 n 和 (m-k1*n) 互质 则 gcd(b,r)=c
以下使用反证法 证明 n 和 (m-k1*n) 互质:
(2)设 n 和 (m-k1*n)不互质 则存在一个大于1的公约数d
则 n =k2*d m-k1*n=k3*d
整理上式 得: n=k2*d m=k3*d+k1*k2*d
根据(1)式 a=m*c b=n*c
则 a=(k3*d+k1*k2*d)*c
=(k3+k1*k2)*d*c
b=k2*d*c
则显然 a 和 b 存在一 个大于c 的约数 d*c
与前提 矛盾 假设(2)成立
所以 n 和 (m-k1*n)互质
所以 b 和 r 有共同的 最大公约数 c
所以gcd(a,b)=c=gcd(b,r)=gcd(b,a%b)
设 a>b
a b a%b
/
int main ()
{
int m,n,temp;
cin>>m>>n;
if(mn==0) // 如果保证 m n 非0的话 这一部分就不需要加上了
{
cout<<m+n;
return 0;
}
temp=m;
while(m%n) //开始跑欧几里得算法
{
m=n;
n=temp%n;
temp=m;
}
cout<<n;
return 0;
}