如何按规则打印数字金字塔,解决现有代码仅兼容N<10的问题
问题根因
原有代码只适配了N<10的场景,存在两个缺陷:
- 前置空格计算逻辑错误:默认每个数字占1个字符,直接用
n-i个单空格做缩进,当数字≥10时占2个字符,原缩进量不足以支撑居中对齐。 - 没有考虑多位数的字符长度差异,导致各行总长度不对称,破坏金字塔结构。
修复代码
我们可以先计算每行数字部分的总字符长度,再根据最后一行的总长度动态计算前置空格数,适配任意大小的N:
#include <iostream> #include <string> using namespace std; int main() { int n; cin >> n; // 预计算最后一行的总字符数,作为居中对齐的基准 int max_len = 0; for (int k = n; k >= 0; --k) max_len += to_string(k).size(); for (int k = 1; k <= n; ++k) max_len += to_string(k).size(); for (int i = 0; i <= n; ++i) { // 计算当前行数字部分的总长度 int cur_len = 0; for (int k = i; k >= 0; --k) cur_len += to_string(k).size(); for (int k = 1; k <= i; ++k) cur_len += to_string(k).size(); // 补前置空格实现居中 for (int j = 0; j < (max_len - cur_len) / 2; ++j) { cout << ' '; } // 原有数字打印逻辑不变 int dir = -1; for (int k = i; k <= i; k += dir) { cout << k; if (k == 0) dir = 1; } cout << endl; } return 0; }
验证效果
当N=10时,输出会自动调整空格数,所有行居中对称,符合数字金字塔的格式要求。
内容的提问来源于stack exchange,提问作者vodnasol
相关产品推荐
相关产品推荐

