AcWing 872. 最大公约数

\(AcWing\) \(872\). 最大公约数

一、题目描述

给定 \(n\) 对正整数 \(a_i,b_i\),请你求出每对数的最大公约数。

输入格式
第一行包含整数 \(n\)

接下来 \(n\) 行,每行包含一个整数对 \(a_i,b_i\)

输出格式
输出共 \(n\) 行,每行输出一个整数对的最大公约数。

数据范围
\(1≤n≤10^5,1≤a_i,b_i≤2×10^9\)

输入样例:

2
3 6
4 6

输出样例:

3
2

二、解题思路

性质\(1\)

\(\large d|a  且  d|b\),
则:

\[\large d | (a+b) \\ d | (a * x + b * y)\]

性质2:

说明: \((a,b)\) 代表\(a\)\(b\)的最大公约数

(a,b) =(b, a % b)

原理让李永乐老师的证明一下给你看: https://v.qq.com/x/cover/0ekhxvyhbdh4h7u/n09564m4hsw.html

三种写法

常规写法

int gcd(int a, int b) {
   if(b) return gcd(b,a % b);
   return a;
}

三元表示式写法

int gcd(int a, int b) {
    return b?gcd(b, a % b):a;
}

库函数写法

__gcd(a, b)

三、实现代码

#include <bits/stdc++.h>

using namespace std;

// 最大公约数,辗转相除法
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

int main() {
    int n;
    cin >> n;
    while (n--) {
        int a, b;
        cin >> a >> b;
        printf("%d\n", gcd(a, b));
    }
    return 0;
}
posted @ 2021-09-27 09:20  糖豆爸爸  阅读(261)  评论(0编辑  收藏  举报
Live2D