欧几里得算法
只需要记住一个公式(不需要推导,这就是数论的基础知识):
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;elsegcd(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)性质