【深基4.例6】数字直角三角形

GitHub跳转原题关系图返回列表

用双层循环按行生成两位编号字符串,再用 join 拼接多行输出。

OJ: luogu

题目 ID: P5721

难度:入门

标签:python入门循环输出格式

日期: 2026-07-15 18:22

题意

输入 n,输出一个数字直角三角形。第一行有 n 个数,第二行有 n-1 个数,直到最后一行 1 个数。所有数字都要输出成两位,不足两位补前导 0

思路

current 记录当前要输出的数字。外层循环控制每行宽度,从 n 递减到 1;内层循环生成这一行的所有两位数字。

每行先放进 row 列表,再用 "".join(row) 拼成一行。所有行放进 lines,最后用 "\n".join(lines) 输出。

brute.py 不适合这题,因为它是输出格式练习题。

Python 知识

  • range(n, 0, -1) 会产生 n, n-1, ..., 1
  • f"{current:02d}" 表示整数宽度至少为 2,不足时左侧补 0
  • "".join(row) 拼接同一行,"\n".join(lines) 拼接多行。
  • 先收集字符串再一次输出,能更容易控制末尾换行。

对应的本地 Python 笔记:

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:字符串拼接和多行输出。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:输出多行答案。

代码

python
n = int(input())
current = 1
lines = []

for width in range(n, 0, -1):
    row = []
    for _ in range(width):
        row.append(f"{current:02d}")
        current += 1
    lines.append("".join(row))

print("\n".join(lines), end="")
cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-27 00:00
 * update_at: 2026-07-27 00:00
 */

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n; // 第一行的数字个数
    cin >> n;
    int current = 1; // 当前要输出的数字
    // 每行宽度从 n 递减到 1
    for (int width = n; width >= 1; width--) {
        for (int j = 0; j < width; j++) {
            printf("%02d", current); // 两位数字,不足补前导 0
            current++;
        }
        cout << endl; // 每行结束换行
    }
    return 0;
}

Pythonic 写法

格式化填三角:

python
n=int(input()); v=1
for i in range(n):
    print(''.join(f'{v+j:02d}' for j in range(n-i)))
    v+=n-i

复杂度

输出的数字个数是 1+2++n=O(n2)1+2+\cdots+n=O(n^2),时间复杂度 O(n2)O(n^2),空间复杂度 O(n2)O(n^2) 用于保存输出行。

总结

格式输出题先设计“每一行怎么生成”,再处理“多行怎么连接”。02d 是补零输出的常用格式。