最大公约数

126 阅读2分钟

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;
}