【深基4.习8】求三角形

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

按行生成两位宽度的编号字符串,先输出 n 行正方形,再右对齐输出三角形。

OJ: luogu

题目 ID: P5725

难度:入门

标签:模拟循环字符串python

日期: 2026-07-15 18:39

题意

输入 n,先输出一个 n * n 的数字正方形,再输出一个右对齐的数字三角形。每个数字都要占两位,不足两位时补前导零。

两个图形之间有一个空行。

思路

正方形部分最直接:从 1 开始,每行输出 n 个数,一共输出 n 行。

三角形部分第 row 行输出 row 个数字,并在前面补空格让它右对齐。因为每个数字占两位,所以少一个数字位置就要补两个空格:

text
"  " * (n - row)

每个数字使用 f"{value:02d}" 格式化成两位,例如 1 变成 01

这题主要训练循环和格式化输出,brute.py 只会重复同样的打印过程,因此不创建额外暴力文件。

Python 知识

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:本题用字符串列表收集一行内容,再 "".join(line) 输出。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:单个整数输入使用 int(input())
  • f"{value:02d}" 表示按整数输出,宽度为 2,不足时左侧补 0
  • " " * k 可以得到重复 k 次的空格块。

代码

python
n = int(input())

value = 1
for row in range(n):
    line = []
    for _ in range(n):
        line.append(f"{value:02d}")
        value += 1
    print("".join(line))

print()

value = 1
for row in range(1, n + 1):
    line = ["  " * (n - row)]
    for _ in range(row):
        line.append(f"{value:02d}")
        value += 1
    print("".join(line))
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 value = 1;
    // 输出 n×n 的数字正方形
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            printf("%02d", value);
            value++;
        }
        cout << endl;
    }
    cout << endl; // 两个图形之间的空行
    // 输出右对齐的数字三角形
    value = 1;
    for (int row = 1; row <= n; row++) {
        // 右对齐:每一行前面补 (n-row) 个"  "(每个数字占两位)
        for (int i = 0; i < n - row; i++) {
            cout << "  ";
        }
        for (int i = 0; i < row; i++) {
            printf("%02d", value);
            value++;
        }
        cout << endl;
    }
    return 0;
}

复杂度

正方形输出 n^2 个数,三角形输出约 n(n+1)/2 个数,时间复杂度是 O(n2)O(n^2)。除当前行字符串外,额外空间复杂度是 O(n)O(n)

总结

这题不是算法难题,重点是格式:两位数字、行内不加额外分隔符、三角形按两位宽度右对齐。