最大公约数
题目描述
对两个正整数,能同时整除两个数的正整数称作两者的“公约数”,例如 2 2 2能同时整除 16 16 16和 28 28 28,故 2 2 2为 16 16 16和 28 28 28的公约数。类似的, 1 , 4 1,4 1,4也是 16 16 16和 28 28 28的公约数。
两个正整数的“最大公约数”为两个数的“公约数”中最大者, m , n m,n m,n的最的最大公约数一般记为 ( m , n ) (m,n) (m,n)或 g c d ( m , n ) {\rm gcd}(m,n) gcd(m,n)。例如 g c d ( 28 , 16 ) = 4 {\rm gcd}(28,16)=4 gcd(28,16)=4; g c d ( 15 , 49 ) = 1 {\rm gcd}(15,49)=1 gcd(15,49)=1。
请计算两个数
n
,
m
n,m
n,m的最大公约数。注意
n
,
m
n,m
n,m可能会很大,需要使用long long
类型。
输入格式
一行,两个整数 n , m n,m n,m,用单个空格隔开。
输出格式
n , m n,m n,m的最大公约数。
样例 #1
样例输入 #1
16 28
样例输出 #1
4
样例 #2
样例输入 #2
100 99
样例输出 #2
1
提示
1 ≤ n , m ≤ 1 0 18 1\le n, m \le 10^{18} 1≤n,m≤1018。
答案
做法一(枚举法)
//可能会超时
#include<bits/stdc++.h>
using namespace std;
int main(){
long long t=0x,y;
cin >> x >> y;
for(t=x; ;t--)
{
if(x%t == 0 && y%t==0)
break;
}
cout << t;
return 0;
}
做法二(辗转相减法)
//也会超时
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin >> a >> b;
while(a != b)
{
if(a>b)
{
a = a - b;
}
else
{
b = b - a;
}
}
cout << a;
return 0;
}
做法三(辗转相除法)
//或许是最优解
#include<bits/stdc++.h>
using namespace std;
int main(){
long long x,y;
cin >> x >> y;
long long t = y;
while(x%y!=0)
{
t = x%y;
x = y;
y = t;
}
cout << t;
return 0;
}