推荐用嵌套std::vector构造杨辉三角:自动内存管理、按需增长;需逐行push_back初始化,避免越界;递推只依赖上一行,边界为1;打印时统一setw对齐防塌陷。
用
动态构造杨辉三角更安全
直接用
静态数组写杨辉三角,看着简单,但一旦行数超限就崩溃,而且无法返回给调用方复用。C++ 里推荐用嵌套
—— 它自动管理内存,还能按需增长。
常见错误是只初始化外层 vector,忘了每行也要
或用
填充:
核心逻辑:只依赖上一行,避免重复计算
杨辉三角第
行第
列(从 0 开始)的值,只由上一行的
和
决定。边界(
或
)始终为 1。
别在循环里反复求组合数(比如
),整数溢出快、性能差
别从左到右覆盖当前行——会污染还未读取的上一行数据;要么从右往左填,要么用独立变量暂存
实际只要两行空间就能滚动计算,但练习阶段建议先写清楚三重结构:初始化 → 边界处理 → 中间递推
输出对齐问题常被忽略,但影响可读性
打印时若不补空格,三角形会“塌”成直角形。关键不是用
(制表符宽度不固定),而是算每行前面要多少个空格:
立即学习
“
C++免费学习笔记(深入)
”;
C知道
CSDN推出的一款AI技术问答工具
下载
最后一行有
个数,假设每个数最多占 4 字符(如 "1234"),那首行前面要留约
个空格
更稳妥的做法:先生成全部数据,再遍历找最大值位数,统一用
格式化
调试时可先关闭对齐,确认数值正确后再加格式;否则数值错+排版乱,双倍难排查
示例片段(仅对齐逻辑):
输入校验和边界情况必须手动处理
或
是高频出错点。标准库不会帮你判断“用户输了个负数”,也不会自动返回空三角。
,而不是继续执行导致未定义行为
:只有一行
,别漏掉这个特例,否则循环从
开始就跳过了
如果函数要返回三角,签名建议用
,而不是 void + 传引用——语义清晰,也方便单元测试
真正容易卡住的,往往是第 0 行怎么建、第 1 行怎么填、循环下标从 0 还是 1 起——这些细节不写出来,光看公式根本没法 debug。
std::vector<:vector>>int a[100][100]std::vectorresizepush_back
// ❌ 错误:第二维没分配,访问 a[i][j] 会越界
vector> a(n);
a[0][0] = 1; // 段错误!
// ✅ 正确:逐行构造,每行长度递增
vector> triangle;
for (int i = 0; i < n; ++i) {
triangle.push_back(vector(i + 1, 1)); // 每行初值全设为 1
}
ijtriangle[i-1][j-1]triangle[i-1][j]j == 0j == iC(n,k)\tn2 * (n - 1)setw
int width = to_string(triangle.back().back()).length();
for (int i = 0; i < n; ++i) {
cout << string((n - i - 1) * width, ' '); // 左侧缩进
for (int x : triangle[i]) {
cout << setw(width) << x << " ";
}
cout << "\n";
}
n = 0n = 1n :应直接返回空 vectorn == 1{1}i = 1vector> generate(int numRows) 