Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目信息
给定 n 对正整数 ai,bi,请你求出每对数的最大公约数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数对 ai,bi。
输出格式
输出共 n 行,每行输出一个整数对的最大公约数。
数据范围
1≤n≤105, 1≤ai,bi≤2×109
输入样例:
2
3 6
4 6
输出样例:
3
2
思路
在看到题目的时候,我们有必要了解题目中的约数的概念
什么是约数
约数,又称因数。整数a除以整数b(b≠0),两数相除得到的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b则被称为是a的约数。
在了解相关的数学基础知识后,我们回到这道题目上,求最大公约数的思路(辗转相除法,又称欧几里得算法):
a和b的最大公约数等于a模b和b的最大公约数,核心公式是:gas(a, b) = gas(b, a % b)
解释:以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数
注意: 在使用公式时我们得让b是正数;所以这里我们使用三元运算符号进行保证,如果b不为负数我们继续使用公式,如果为负数,我们让a代替b的位置继续计算。
代码
#include <iostream>
using namespace std;
int gas(int a, int b)
{
return b ? gas(b, a % b) : a;
}
int main()
{
int n;
cin >> n;
while(n --)
{
int a, b;
cin >> a >> b;
cout << gas(a, b) << endl;
}
return 0;
}