1 条题解

  • 0
    @ 2026-3-22 20:41:53

    画三角形 完整题解(C++)

    针对GESP二级的“画三角形”问题,我为你提供可直接提交、逻辑清晰的代码,同时用简单易懂的方式解释核心思路,适合小学生理解和考试使用。

    最终可提交代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        
        int current_char = 0; // 记录当前要输出的字母(0对应A,1对应B...25对应Z)
        
        // 外层循环:控制行数(从1到n行)
        for (int i = 1; i <= n; i++) {
            // 内层循环:控制每行输出的字母数量(第i行输出i个字母)
            for (int j = 1; j <= i; j++) {
                // 计算当前字母:current_char % 26 实现Z后回到A,+65转换为ASCII码(A的ASCII是65)
                char c = 'A' + (current_char % 26);
                cout << c;
                current_char++; // 切换到下一个字母
            }
            cout << endl; // 每行结束换行
        }
        
        return 0;
    }
    

    解题思路(小学生能懂)

    1. 核心需求拆解

      • 输入n,输出n行;第1行1个字母,第2行2个字母……第n行n个字母;
      • 字母从A开始依次填充,Z之后回到A循环;
      • 每行右侧无多余空格(直接输出字母,不补空格)。
    2. 关键知识点

      • 字母循环:A-Z共26个字母,用 current_char % 26 实现循环(比如25对应Z,26%26=0对应A,27%26=1对应B);
      • ASCII码转换:大写字母A的ASCII码是65,B是66……Z是90,所以 'A' + 数字 可以得到对应字母(比如 'A'+0=A'A'+25=Z);
      • 双层循环:外层循环控制行数,内层循环控制每行输出的字母数。
    3. 样例验证(输入3)

      • 第1行(i=1):j=1 → current_char=0 → 'A'+0=A → 输出A,current_char变为1;
      • 第2行(i=2):j=1 → current_char=1 → B,j=2 → current_char=2 → C → 输出BC,current_char变为3;
      • 第3行(i=3):j=1→D,j=2→E,j=3→F → 输出DEF;
      • 最终输出和样例1完全一致。
    4. 循环验证(输入7): 第7行需要输出7个字母,前6行总共输出 1+2+3+4+5+6=21 个字母,第7行从第22个字母开始:

      • 21 → 'A'+21=V,22→W,23→X,24→Y,25→Z,26→A(26%26=0),27→B(27%26=1);
      • 所以第7行输出 VWXYZAB,和样例2一致。

    代码运行验证

    输入 输出(关键行)
    3 A
    BC
    DEF
    7 A
    BC
    DEF
    GHIJ
    KLMNO
    PQRSTU
    VWXYZAB

    总结

    1. 核心逻辑
      • current_char 累计字母序号,%26 实现A-Z循环,'A' + 序号 转换为字母;
      • 外层循环控行数(1~n),内层循环控每行字母数(1~当前行数)。
    2. 考试注意点
      • 无需输出多余空格,直接连续输出字母即可;
      • 注意数据范围(n≤40),代码中current_char用int类型足够,不会溢出;
      • 严格按样例格式换行,每行结束必须输出endl
    • 1

    信息

    ID
    674
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    5
    已通过
    3
    上传者