蓝桥杯C++基础算法-最大公约数
这段代码的功能是计算两个整数的最大公约数(GCD),并处理多次查询。它使用了欧几里得算法来高效地计算最大公约数。以下是代码的详细思路解析:
1. 问题背景
给定一组整数对,目标是计算每对整数的最大公约数(GCD)。最大公约数是指能够同时整除两个整数的最大正整数。
2. 欧几里得算法的概念
欧几里得算法是一种高效的算法,用于计算两个整数的最大公约数。其核心思想是利用递归关系: gcd(a,b)=gcd(b,a%b) 当 b=0 时,最大公约数为 a。
3. 代码逻辑解析
(1) GCD 函数
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
-
输入:两个整数
a
和b
。 -
输出:这两个整数的最大公约数。
-
逻辑:
-
如果
b
不为 0,递归调用gcd(b, a % b)
。 -
如果
b
为 0,返回a
,因为此时a
就是最大公约数。
-
(2) 主函数
int main()
{
int n; cin >> n; // 输入查询次数
while (n--)
{
int a, b;
cin >> a >> b; // 输入两个整数
cout << gcd(a, b) << endl; // 输出它们的最大公约数
}
return 0;
}
-
输入:查询次数
n
,然后是n
对整数。 -
逻辑:
-
使用一个循环处理每个查询。
-
对于每对整数
a
和b
,调用gcd
函数计算它们的最大公约数。 -
输出结果。
-
4. 示例运行
输入:
3
12 18
25 15
7 13
运行过程:
-
输入查询次数
n = 3
。 -
输入3对整数:
-
第1对:
12
和18
-
第2对:
25
和15
-
第3对:
7
和13
-
-
计算每对整数的最大公约数:
-
gcd(12, 18)
:-
gcd(18, 12 % 18) = gcd(18, 12)
-
gcd(12, 18 % 12) = gcd(12, 6)
-
gcd(6, 12 % 6) = gcd(6, 0)
,返回6
-
-
gcd(25, 15)
:-
gcd(15, 25 % 15) = gcd(15, 10)
-
gcd(10, 15 % 10) = gcd(10, 5)
-
gcd(5, 10 % 5) = gcd(5, 0)
,返回5
-
-
gcd(7, 13)
:-
gcd(13, 7 % 13) = gcd(13, 7)
-
gcd(7, 13 % 7) = gcd(7, 6)
-
gcd(6, 7 % 6) = gcd(6, 1)
-
gcd(1, 6 % 1) = gcd(1, 0)
,返回1
-
-
-
输出结果:
6 5 1
输出:
6
5
1
5. 总结
这段代码的核心思路是通过欧几里得算法高效地计算两个整数的最大公约数。欧几里得算法的时间复杂度为 O(logmin(a,b)),非常高效。代码通过一个循环处理多次查询,每次调用 gcd
函数计算结果并输出。
完整代码
// 包含标准库中的所有头文件,方便使用标准库的各种功能
#include<bits/stdc++.h>
// 使用标准命名空间,这样在使用标准库的标识符时无需加 std:: 前缀
using namespace std;
// 定义一个函数 gcd 用于计算两个整数 a 和 b 的最大公约数
// 采用欧几里得算法(辗转相除法)
int gcd(int a, int b)
{
// 如果 b 不为 0,递归调用 gcd 函数,计算 b 和 a % b 的最大公约数
// 如果 b 为 0,说明此时 a 就是最大公约数,返回 a
return b ? gcd(b, a % b) : a;
}
// 主函数,程序的入口点
int main()
{
// 定义一个整数 n,用于存储接下来要输入的组数
int n;
// 从标准输入读取一个整数并赋值给 n
cin >> n;
// 循环 n 次,每次循环结束后 n 的值减 1
while(n --)
{
// 定义两个整数 a 和 b,用于存储每组输入的两个数
int a, b;
// 从标准输入读取两个整数并分别赋值给 a 和 b
cin >> a >> b;
// 调用 gcd 函数计算 a 和 b 的最大公约数,并将结果输出到标准输出
// 输出结果后换行
cout << gcd(a, b) << endl;
}
// 程序正常结束,返回 0
return 0;
}