题解:洛谷 P5721 数字直角三角形

【题目来源】

洛谷:P5721 【深基4.例6】数字直角三角形 - 洛谷

【题目描述】

给出 \(n\),请输出一个直角边长度是 \(n\) 的数字直角三角形。所有数字都是 \(2\) 位组成的,如果没有 \(2\) 位则加上前导 \(0\)

【输入】

输入一个正整数 \(n\)

【输出】

输出如题目要求的数字直角三角形。

【输入样例】

5

【输出样例】

0102030405
06070809
101112
1314
15

【核心思想】

  1. 问题分析:给定 \(n\),输出一个直角边长度为 \(n\) 的数字直角三角形。第 \(i\) 行有 \(n+1-i\) 个数字,所有数字按顺序从 \(1\) 开始递增,每个数字占两位(不足两位前补 \(0\))。

  2. 算法选择

    • 双重循环构造:外层控制行数,内层控制每行数字个数,用计数器 mark 顺序生成数字
    • 格式化输出printf("%02d", mark) 保证每个数字占两位,不足补前导零
  3. 关键步骤

    • 读入数据cin >> n
    • 初始化mark = 1(从 1 开始计数)
    • 外层循环\(i\)\(1\)\(n\)):控制行数
      • 内层循环\(j\)\(1\)\(n+1-i\)):控制每行输出数字个数
        • printf("%02d", mark):输出两位格式的当前数字
        • mark++:数字递增
      • printf("\n"):每行结束换行
    • 输出结果:形成直角三角形
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n^2)\),总共输出 \(1+2+\cdots+n = \frac{n(n+1)}{2}\) 个数字
    • 空间复杂度:\(O(1)\),仅需计数器和循环变量
  5. 格式化输出的核心思想

    • %02d 格式控制printf%02d 表示输出至少两位整数,不足时在左侧补 \(0\),恰好满足题目"两位组成"的要求
    • 递减行宽:第 \(i\) 行输出 \(n+1-i\) 个数字,形成直角三角形的斜边
    • 全局顺序计数mark 从 1 开始全局递增,不受行边界影响,保证数字连续
    • 适用于图形构造、格式化输出、双重循环类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int n;               // 定义变量:数字三角形的行数
    int mark = 1;        // 定义变量:当前要打印的数字(从1开始)

    cin >> n;            // 输入行数n

    // 外层循环控制行数(1到n行)
    for (int i = 1; i <= n; i++)
    {
        // 内层循环控制每行输出的数字个数(n+1-i个)
        for (int j = 1; j <= n + 1 - i; j++)
        {
            printf("%02d", mark);  // 输出两位数格式的数字(不足补零)
            mark++;                // 数字递增
        }
        printf("\n");              // 每行结束换行
    }

    return 0;            // 程序正常结束
}

【运行结果】

5
0102030405
06070809
101112
1314
15
posted @ 2026-08-05 15:47  团爸讲算法  阅读(17)  评论(0)    收藏  举报