用双层循环按行生成两位编号字符串,再用 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复杂度
输出的数字个数是
总结
格式输出题先设计“每一行怎么生成”,再处理“多行怎么连接”。02d 是补零输出的常用格式。