如何在C++中根据输入值生成指定格式的动态数值矩阵?
目标矩阵核心规律
对照给出的5阶样例逐位校验,可提炼出适配任意规模的通用规则:
- 按行号
i、列号j均从1开始计数的约定,矩阵第i行第j列的数值固定为i和j的较小值,即min(i,j) - 输出结构为n行n列的完整方阵,不存在逐行缩短的三角结构
- 样例规则验证:
第2行(i=2):j=1时min(2,1)=1,j>=2时min(2,j)=2,对应输出
1 2 2 2 2,和给出的样例完全匹配
第5行(i=5):j<5时输出对应列号j,j=5时输出5,对应输出1 2 3 4 5,完全符合预期
原代码的逻辑偏差
- 内层循环边界设置为
j <= n+1-i,导致每一行的输出列数逐行递减(第一行n个元素、第二行n-1个……最后一行仅1个元素),最终输出逐行缩短的倒三角金字塔,而非n列的方阵 - 未按min(i,j)的规则计算单元格数值,仅按列号顺序输出,数值分布和目标矩阵完全不符
代码调整实现
调整思路完全匹配上述规律,支持任意规模n的动态扩展:
- 修正内层循环边界:每一行遍历输出全部n个列元素,即
j从1走到n - 单元格取值替换为行号、列号的较小值,直接套用通用矩阵规则
- 增加固定宽度的对齐控制,避免数字位数增加时格式错乱,匹配样例的等距输出效果
完整可运行代码:
#include <iostream> #include <iomanip> using namespace std; int main() { int n, i, j; cin >> n; for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { // 用三元运算取i、j的较小值,无需额外引入头文件 cout << setw(6) << (i < j ? i : j); } cout << endl; } return 0; }
代码运行效果:
- 输入n=5时,输出和给出的样例完全一致
- 输入任意更大的n值,矩阵会自动按照min(i,j)的规则扩展,对齐格式不会错乱,满足无限扩展的需求
内容的提问来源于stack exchange,提问作者bogdan
相关产品推荐
相关产品推荐

