图形打印方法:从正方形到三角形的编程实践(洛谷P5725)
题目核心考点解析
这道题目主要考察以下几个核心编程能力:
1. 循环结构的灵活运用(⭐⭐⭐⭐⭐)
- 嵌套循环:处理二维图形的行与列关系
- 循环控制:精确控制循环次数和边界条件
- 循环变量关系:通过循环变量计算输出内容
2. 格式化输出能力(⭐⭐⭐⭐)
- 数字格式化:两位数补零显示(如01、02)
- 空格控制:实现三角形的对齐效果
- 换行处理:图形间的空行分隔
3. 数学思维与模式识别(⭐⭐⭐)
- 数字序列规律:连续数字的排列方式
- 图形空间关系:字符位置与行列号的数学关系
- 对称性处理:图形的对称特性利用
解法实现与代码分析
基础解法:分步实现
#include <iostream>
#include <iomanip>
using namespace std;void printSquare(int n) {int num = 1;for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {cout << setw(2) << setfill('0') << num++;}cout << endl;}
}void printTriangle(int n) {int num = 1;for(int i=1; i<=n; i++) {// 打印前导空格cout << string(2*(n-i), ' ');// 打印数字for(int j=1; j<=i; j++) {cout << setw(2) << setfill('0') << num++;}cout << endl;}
}int main() {int n;cin >> n;printSquare(n);cout << endl; // 中间空行printTriangle(n);return 0;
}
优化解法:数学计算版
#include <iostream>
#include <iomanip>
using namespace std;int main() {int n;cin >> n;// 正方形部分for(int i=0; i<n*n; i++) {cout << setw(2) << setfill('0') << i+1;if((i+1)%n == 0) cout << endl;}cout << endl;// 三角形部分int total = n*(n+1)/2;int current = 1;for(int row=1; row<=n; row++) {cout << string(2*(n-row), ' ');for(int col=1; col<=row; col++) {cout << setw(2) << setfill('0') << current++;}cout << endl;}return 0;
}
关键知识点详解
1. 格式化输出技巧
// 设置输出宽度为2,不足补零
cout << setw(2) << setfill('0') << num;
setw(n)
:设置输出字段宽度setfill(c)
:设置填充字符- 需要包含
<iomanip>
头文件
2. 数字序列生成
正方形数字规律:
第i行数字范围:[(i-1)*n+1, i*n]
三角形数字规律:
第i行数字数量:i
总数字数:1+2+...+n = n(n+1)/2
3. 空格对齐控制
// 打印2*(n-row)个空格
cout << string(2*(n-row), ' ');
- 使用
string
构造函数快速生成空格串 - 每行前导空格数:
2*(总行数-当前行数)
测试用例与验证
输入n | 正方形行数 | 三角形行数 | 验证要点 |
---|---|---|---|
1 | 1行1列 | 1行 | 最小边界 |
3 | 3行3列 | 3行 | 常规情况 |
9 | 9行9列 | 9行 | 最大边界 |
5 | 5行5列 | 5行 | 中间值 |
常见错误与修正
错误1:数字对齐问题
// 错误写法:未格式化输出
cout << num++; // 显示为1,2,3...而非01,02,03...
修正:必须使用setw
和setfill
错误2:空格计算错误
// 错误写法:空格数计算错误
cout << string(n-i, ' '); // 少了一半空格
修正:2*(n-i)
确保正确对齐
错误3:换行位置错误
// 错误写法:在数字前换行
cout << endl << setw(2) << num++;
修正:在每行结束后换行
竞赛技巧总结
- 模式识别优先:先分析图形规律再编码
- 数学关系利用:通过行列号计算数字位置
- 格式化输出技巧:善用
iomanip
库函数 - 边界测试:特别注意n=1和n=9的情况
拓展练习
变形练习1:打印倒三角形
01020304050607080910
变形练习2:打印数字菱形
010203 040506070809
进阶挑战:实现可旋转的图形输出(通过参数控制方向)
"图形打印题是算法竞赛的基础试金石,掌握其核心在于将视觉规律转化为数学关系" —— 通过这道题,我们深入理解了二维图形的编程表达方式
关注并私信【图形打印】,可获得:
- C++格式化输出大全
- 洛谷图形打印题单