【GESP】C++一级真题 luogu-B4355 [GESP202506 一级] 值日
GESP C++一级真题,基础运算和循环语句,难度★☆☆☆☆。
luogu-B4355 [GESP202506 一级] 值日
题目要求
题目描述
小杨和小红是值日生,负责打扫教室。小杨每 $m$ 天值日一次,小红每 $n$ 天值日一次。今天他们两个一起值日,请问至少多少天后,他们会再次同一天值日?
输入格式
第一行,一个正整数 $m$,表示小杨的值日周期;
第二行,一个正整数 $n$,表示小红的值日周期。
输出格式
一行,一个整数,表示至少多少天后他们会再次同一天值日。
输入输出样例 #1
输入 #1
1
2
4
6
输出 #1
1
12
说明/提示
对于所有测试点,保证 $1 \leq m, n \leq 100$。
题目分析
解题思路
本题的解题思路如下:
- 问题本质:
- 输入两个正整数 $m$ 和 $n$,分别表示小杨和小红的值日周期
- 需要计算他们下一次同时值日的最小天数
- 解题关键:
- 核心思路 - 最小公倍数:
- 两个人同时值日的天数必须同时满足:
- 能被小杨的值日周期 $m$ 整除
- 能被小红的值日周期 $n$ 整除
- 这实际上就是求两个数的最小公倍数(LCM)
- 可以通过循环从较大值开始查找
- 也可以通过 C++ 标准库中的
std::lcm
函数(C++17及以上版本,不符合GESP考试要求:-std=c++11
)直接计算最小公倍数,或使用std::gcd
函数计算最大公约数后,通过公式 LCM = (a × b) ÷ GCD(a,b) 计算
- 两个人同时值日的天数必须同时满足:
- 核心思路 - 最小公倍数:
- 复杂度分析:
- 时间复杂度:$O(min(m,n))$,需要循环查找或计算最大公约数
- 空间复杂度:$O(1)$,只需要存储几个整数变量
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
int main() {
// 声明变量n和m用于存储输入的两个值日周期
int n,m;
// 从标准输入读取两个整数
std::cin >> n >> m;
// 找出两个周期中的较大值作为循环起点
int big = n > m ? n : m;
// 从较大值开始循环,直到找到符合条件的天数
for (int i = big; ;i++) {
// 如果当前天数能同时被两个周期整除,说明是他们再次同时值日的日子
if (i % n == 0 && i % m == 0) {
// 输出结果并结束循环
std::cout << i;
break;
}
}
return 0;
}
利用lcm函数示例(需-std=c++17
以上,不推荐,不符合GESP官方C++ 编译等级要求)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <numeric>
int main() {
// 声明整型变量n和m,用于存储两个人的值日周期
int n,m;
// 从标准输入读取两个值日周期
std::cin >> n >> m;
// 使用C++标准库的lcm函数计算最小公倍数并输出
std::cout << std::lcm(n,m);
// 程序正常结束
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲、真题讲解、知识拓展和练习清单等详见【置顶】【GESP】C++ 认证学习资源汇总
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
本文由作者按照 CC BY 4.0 进行授权