欧几里得算法
只需要记住一个公式(不需要推导,这就是数论的基础知识):
step1:
判断小括号内右边的数字 b 是否为0,如果为0,输出小括号左边的数字 a ,就是一开始要求的两个数的最大公约数
step2:
如果 b != 0,递归进入 gcd(b,a%b),这样一直缩小小括号右边的数字,直到这个右边的数字为0,那么此时左边的数就是一开始要求的两个数的最大公约数
题目如下:
给定 n 对正整数 ai,bi,请你求出每对数的最大公约数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数对 ai,bi
输出格式
输出共 n 行,每行输出一个整数对的最大公约数。
数据范围
1≤n≤105
1≤ai,bi≤2×109
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int n;
int gcd(int a,int b)
{
if(b ==0)
return a;
else
gcd(b,a%b);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
while(n--)
{
int a;
int b;
cin >> a >> b;
cout << gcd(a,b) << endl;
}
return 0;
}
(1)模拟过程
(2)性质