100%AC题解
2026-07-29 22:11:27
发布于:重庆
1.观察图形,找规律
题目给的样例是 n = 3,输出为:
1
123
12345
我们要把它当成一个数学坐标系来分析。设行号为 i(从 1 开始计数):
以 n=3 为例:
第 1 行:前面 2 个空格,输出 1(1 个数字)
第 2 行:前面 1 个空格,输出 123(3 个数字)
第 3 行:前面 0 个空格,输出 12345(5 个数字)
得出核心规律(公式化):
空格数 = n - i(例如第 1 行:3-1=2)
数字个数 = 2 * i - 1(例如第 2 行:2*2-1=3)
数字内容:每行都是从 1 开始,连续递增到 (2*i - 1),并且数字之间没有空格,直接拼接。
2.画图模拟执行过程(以 n=3 为例)
第一轮(i=1):
计算空格:n - i = 2,所以先打印 2 个空格(光标移动到第 3 列)。
计算数字个数:2*i - 1 = 1,循环打印 j 从 1 到 1,输出 1。
换行。
屏幕效果:__1(_代表空格)
第二轮(i=2):
计算空格:3 - 2 = 1,打印 1 个空格(光标移动到第 2 列)。
计算数字个数:2*2 - 1 = 3,循环打印 j 从 1 到 3,输出 123。
换行。
屏幕效果:_123
第三轮(i=3):
计算空格:3 - 3 = 0,不打印空格(光标在第 1 列)。
计算数字个数:2*3 - 1 = 5,循环打印 j 从 1 到 5,输出 12345。
换行。
屏幕效果:12345
拼起来,就是标准的:
1
123
12345
3.边界与细节思考(易错点)
数字连在一起:输出数字时用的是 cout << j,而不是 cout << j << " "。如果加了空格,图形会变成 1 2 3,不符合题目要求。
换行时机:每打印完一行(即打印完 2*i-1 个数字后),必须换行。
为什么题目限制 0 < n < 10?
因为如果 n >= 10,最后一行的数字会变成 123456789101112...,数字的位数从 1 位变成 2 位,会导致每个字符占据的宽度不一致(例如 10 占了两个字符位置),图形就没办法靠单纯的空格对齐成漂亮的等腰三角形了。所以题目限制 n < 10,保证所有数字都是 1 位,每个字符宽度严格相等。
4.AC代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >>n;
for (int i=1;i<=n;i++) {
// 输出前导空格
for (int j=1;j<=n-i;j++) {
cout<<' ';
}
// 输出数字
for (int j=1;j<=2*i-1;j++) {
cout <<j;
}
cout <<endl;
}
return 0;
}
这里空空如也







有帮助,赞一个