二级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++二级练习 luogu-B3736 [信息与未来 2018] 最大公约数
📅 2025-03-16·✍️ OneCoder·计算中...·⏱️ 4 分钟
#GESP#C++#基础语句
GESP二级练习,循环分支练习,难度★☆☆☆☆。
luogu-B3736 [信息与未来 2018] 最大公约数
题目要求
题目描述
输入三个正整数 ,求它们的最大公约数(Greatest Common Divisor):最大的正整数 ,满足 都是 的倍数,即 。
输入格式
输入一行三个正整数 。
输出格式
输出一行一个整数 ,表示 的最大公约数。
输入 #1
BASH
12 34 56
输出 #1
BASH
2
输入 #2
BASH
28 70 28
输出 #2
BASH
14
数据规模
所有数据满足 。
本题原始满分为 。
题目分析
解题思路
-
最大公约数不会超过三个数中的最小值,因此可以从最小值开始向下枚举,第一个能同时整除三个数的值即为答案。
-
实现步骤:
- 读入三个正整数 。
- 用
min(x, min(y, z))求出三者的最小值 。 - 从 到 递减遍历,判断
x % i == 0 && y % i == 0 && z % i == 0。 - 找到第一个满足条件的 ,即为最大公约数,
break退出循环。 - 输出结果。
示例代码
CPP
#include <cmath>
#include <iostream>
using namespace std;
int main() {
// 声明三个整数变量用于存储输入的数字
int x, y, z;
// 从标准输入读取三个数字
cin >> x >> y >> z;
// 找出三个数字中的最小值,因为最大公约数不会超过最小的数
int m = min(x, min(y, z));
// 初始化答案变量
int ans = 0;
// 从最小值开始向下遍历,找到第一个能同时整除三个数的数
for (int i = m; i >= 1; i--) {
// 判断i是否能同时整除x、y、z
if (x % i == 0 && y % i == 0 && z % i == 0) {
// 找到最大公约数,赋值给ans
ans = i;
// 找到后立即退出循环
break;
}
}
// 输出最大公约数
cout << ans;
// 程序正常结束
return 0;
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!