题解:洛谷 P5721 数字直角三角形
【题目来源】
【题目描述】
给出 \(n\),请输出一个直角边长度是 \(n\) 的数字直角三角形。所有数字都是 \(2\) 位组成的,如果没有 \(2\) 位则加上前导 \(0\)。
【输入】
输入一个正整数 \(n\)。
【输出】
输出如题目要求的数字直角三角形。
【输入样例】
5
【输出样例】
0102030405
06070809
101112
1314
15
【核心思想】
-
问题分析:给定 \(n\),输出一个直角边长度为 \(n\) 的数字直角三角形。第 \(i\) 行有 \(n+1-i\) 个数字,所有数字按顺序从 \(1\) 开始递增,每个数字占两位(不足两位前补 \(0\))。
-
算法选择:
- 双重循环构造:外层控制行数,内层控制每行数字个数,用计数器
mark顺序生成数字 - 格式化输出:
printf("%02d", mark)保证每个数字占两位,不足补前导零
- 双重循环构造:外层控制行数,内层控制每行数字个数,用计数器
-
关键步骤:
- 读入数据:
cin >> n - 初始化:
mark = 1(从 1 开始计数) - 外层循环(\(i\) 从 \(1\) 到 \(n\)):控制行数
- 内层循环(\(j\) 从 \(1\) 到 \(n+1-i\)):控制每行输出数字个数
printf("%02d", mark):输出两位格式的当前数字mark++:数字递增
printf("\n"):每行结束换行
- 内层循环(\(j\) 从 \(1\) 到 \(n+1-i\)):控制每行输出数字个数
- 输出结果:形成直角三角形
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(n^2)\),总共输出 \(1+2+\cdots+n = \frac{n(n+1)}{2}\) 个数字
- 空间复杂度:\(O(1)\),仅需计数器和循环变量
-
格式化输出的核心思想:
- %02d 格式控制:
printf的%02d表示输出至少两位整数,不足时在左侧补 \(0\),恰好满足题目"两位组成"的要求 - 递减行宽:第 \(i\) 行输出 \(n+1-i\) 个数字,形成直角三角形的斜边
- 全局顺序计数:
mark从 1 开始全局递增,不受行边界影响,保证数字连续 - 适用于图形构造、格式化输出、双重循环类入门问题
- %02d 格式控制:
【算法标签】
入门 #模拟
【代码详解】
#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
浙公网安备 33010602011771号