OneCoder Avatar
OneCodercoderli.com · 937 篇博文
二级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【GESP】C++二级练习 luogu-B3736 [信息与未来 2018] 最大公约数

📅 2025-03-16·✍️ OneCoder·计算中...·⏱️ 4 分钟
#GESP#C++#基础语句

GESP二级练习,循环分支练习,难度★☆☆☆☆。

luogu-B3736 [信息与未来 2018] 最大公约数

题目要求

题目描述

输入三个正整数 x,y,zx,y,z,求它们的最大公约数(Greatest Common Divisor)gg:最大的正整数 g1g ≥1,满足 x,y,zx,y,z 都是 gg 的倍数,即 (xmodg)=(ymodg)=(zmodg)=0(x \bmod g) = (y \bmod g) = (z \bmod g) = 0

输入格式

输入一行三个正整数 x,y,zx,y,z

输出格式

输出一行一个整数 gg,表示 x,y,zx,y,z 的最大公约数。

输入 #1

BASH
12 34 56

输出 #1

BASH
2

输入 #2

BASH
28 70 28

输出 #2

BASH
14

数据规模

所有数据满足 1x,y,z1061 ≤ x,y,z ≤ 10^6

本题原始满分为 15pts15\text{pts}


题目分析

解题思路

  1. 最大公约数不会超过三个数中的最小值,因此可以从最小值开始向下枚举,第一个能同时整除三个数的值即为答案。

  2. 实现步骤:

    • 读入三个正整数 x,y,zx, y, z
    • min(x, min(y, z)) 求出三者的最小值 mm
    • i=mi = mi=1i = 1 递减遍历,判断 x % i == 0 && y % i == 0 && z % i == 0
    • 找到第一个满足条件的 ii,即为最大公约数,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

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!