这道题是 GESP 2023年3月 的真题,难度定位在 二级。别看它代码不长,里面对循环结构的考查很到位,我第一次做的时候也踩了坑。下面把完整思路梳理一遍。
题目来源:ACGO A46104 | 2023年3月 二级
赛事场次:2023年3月 二级
一、题目信息
题目名称:画三角形
赛事场次:2023年3月 二级
难度定位:二级
涉及知识点:循环结构
题目链接:https://www.acgo.cn/problemset/info/46104
坑点(这题失分基本都在这)
- 循环三要素:初值、条件、步进;循环不变式。
题意简述
输入一个正整数 n,请使用大写字母拼成一个这样的三角形图案(参考样例输入输出):三角形图案的第 1 行有 1 个字母,第 2 行有 2 个字母,以此类推;在三角形图案中,由上至下、由左至右依次由大写字母 A~Z 填充,每次使用大写字母 Z 填充后,将从头使用大写字母 A 填充。
前置知识
做题之前,我们先把几个关键概念说清楚,这样后面的代码才好理解。
for 循环的标准写法:for(int i=1;i<=n;i++)表示 i 从 1 递增到 n,每次循环体执行完 i 自动加 1。竞赛中我们习惯从 1 开始计数,这样可以避免下标越界的麻烦。
while 循环:适合循环次数不确定的场景,只要条件成立就一直执行,写的时候一定要确保循环变量会被修改,否则会死循环。
二、思路分析
先看清楚题目要我们做什么
把题目读两遍,我们提取出关键信息:输入是什么、要输出什么、有哪些约束条件。这道题考查的是循环结构,属于这类题里比较基础的一道,把题目要求一步步翻译成代码逻辑就能解决。
我的思考过程
读完题之后,我的第一反应是这样的:【题目大意】输出一个 n 行的大写字母递增的三角形,大写字母递增到 'Z' 后下一个回到 'A' 重新开始递增。
【考纲知识点】基本运算(一级), 循环结构、ASCII 码、数据类型转换(二级)
【解题思路】
- 先把 A,B,C… Z 这些大写字母看作 0,1,2… 25,借助 for 循环嵌套输出数字三角形;
- 将三角形中需要输出的数在输出时转换为大写字母输出;
- 将数转换为大写字母时加上 %26,确保输出到 'Z' 之后下一个字符为 'A'。这里也可以使用分支语句在需要输出的数超过 25 时将其修改为 0 从而实现 0~25 的循环输出。
【参考程序】
需要说明的是,上面这个思路是把题目要求直译成代码得到的,没有用到什么高级技巧。对于这类基础题,读准题意加写对边界比追求巧妙解法更重要,因为考试里这种题是必须拿满分的。
三、完整代码 + 逐行注释
#include <iostream> using namespace std; int main() { int n; cin >> n; // 读入 int ch = 0; //定义 ch 计数 for (int i = 1; i <= n; i++) { //外层循环:三角形共有 n 行 for (int j = 1; j <= i; j++) { // 遍历 //第一步可以在此处输出 ch,确保三角形的格式正确,再考虑将 ch 转换成对应的大写字母 cout << (char)('A' + (ch++) % 26); //将输出的数转换为大写字母 } cout << endl; // 输出 } return 0; }四、代码分段拆解
为了看得更清楚,我们把代码按功能分成几段解释。
第一步:引入头文件
#include <iostream> using namespace std;#include <iostream>提供输入输出功能,using namespace std;让我们能直接写cin、cout而不用加前缀。这两行是几乎所有 C++ 程序的开头,照写即可。
第二步:读入数据
cin >> n;注意变量的类型要能装下题目的数据。数据可能超过 21 亿时要改用long long。
第三步:核心处理逻辑
for (int i = 1; i <= n; i++) { //外层循环:三角形共有 n 行 for (int j = 1; j <= i; j++) {这一段是整道题的关键,也是循环结构的体现。看循环的三个要素:从哪里开始、什么时候结束、每次怎么变化。这三个要素任何一个写错,结果都会不对。
第四步:按要求输出
cout << (char)('A' + (ch++) % 26); //将输出的数转换为大写字母 cout << endl;输出格式必须和题目要求的完全一致。很多同学算法完全正确却因为少了一个换行或者空格多寡不对而 WA,这种分丢得最可惜。
五、实例模拟
把样例代进去手动模拟一遍,思路会更清晰。
以题目的第一组样例为例:
样例输入
3样例输出
A BC DEF把这份输入代进代码,程序会先把数据依次读入,然后进入循环逐个判断,把满足条件的值累积起来,最后按格式输出。建议你对照着代码在纸上走一遍前两次循环,确认自己对每一步的理解都和程序一致。
题目另外还给了 1 组样例,做完之后建议把剩下的样例都跑一遍,全部通过再提交,能避开大部分边界问题。
六、踩坑总结
下面是做这道题时最容易出错的地方,对照自己的代码检查一下:
- 变量类型选错:虽然本题范围不大,但养成习惯——凡是不确定范围时,累加变量一律用
long long,成本为零但能保命。 - 循环起点搞错:题目说的是「正整数」,循环要从 1 开始而不是从 0 开始,差一个数就是 WA。
- 输出格式不符:题目要求输出几行就输出几行,行末换行、数字之间的空格都要严格对齐,算法对了但格式错了同样判 WA,这种分丢得最冤。
- 特殊情况没特判:把最小数据、最大数据、答案恰好等于 0 的情况各测一遍。特别是边界输入,出题人最喜欢在这里设陷阱。
七、知识点拓展
把这题的经验提炼一下,以后遇到同类题可以直接套用:
- 本题考查循环结构的基本写法,这类题在考试中属于必得分项,要练到能默写。
- 写完代码后建议自己造几组边界数据测试,特别是最小值和最大值。
- 同一知识点在不同场次反复出现,把这道题的写法吃透,后面遇到同类题可以直接套用。
八、适用人群
适合正在备考 二级、想确认自己循环结构基础是否扎实的同学。
如果这篇题解对你有帮助,欢迎点赞收藏。后续我会继续按场次整理 2023年3月 二级 的真题,关注我可以第一时间看到更新。有更好的写法也欢迎在评论区交流。