如何用for循环在C++字母K图案中逐行减少空格?
解决C++中字母K图案上半部分空格逐行递减的问题
你的核心问题是上半部分的空格数没有和当前行数绑定,用了固定值导致每行空格一致。要实现逐行减1的效果,只需要让空格数随循环的行号动态计算即可。
问题版代码(你的现有逻辑)
#include <iostream> using namespace std; int main() { int size; cin >> size; // 上半部分:空格数固定,导致每行开头空格无变化 for (int i = 0; i < size; i++) { // 这里的size-1是固定值,就是问题根源 for (int j = 0; j < size - 1; j++) { cout << " "; } cout << "*"; if (i > 0) { for (int j = 0; j < i; j++) { cout << " "; } cout << "*"; } cout << endl; } return 0; }
修改后的完整代码
#include <iostream> using namespace std; int main() { int size; cin >> size; // 上半部分:共size行,空格逐行递减1 for (int i = 0; i < size; i++) { // 动态计算每行开头空格数:第i行(从0开始)的空格数为 size-1 - i for (int j = 0; j < size - 1 - i; j++) { cout << " "; } cout << "*"; // 从第二行开始,输出中间空格和右侧的* if (i > 0) { // 中间空格数:每行比上一行多2个,对应公式2*i -1 for (int j = 0; j < 2 * i - 1; j++) { cout << " "; } cout << "*"; } cout << endl; } // 下半部分:对称逆序,复用上半部分的空格逻辑 for (int i = size - 2; i >= 0; i--) { for (int j = 0; j < size - 1 - i; j++) { cout << " "; } cout << "*"; if (i > 0) { for (int j = 0; j < 2 * i - 1; j++) { cout << " "; } cout << "*"; } cout << endl; } return 0; }
关键修改说明
- 开头空格动态计算:把固定的
size-1改成size-1 - i,i是当前行的索引(从0开始)。这样第1行有size-1个空格,第2行减少1个,直到最后一行空格数为0,完全匹配需求。 - 中间空格适配K形:两个
*之间的空格用2*i -1计算,保证每行中间空格比上一行多2个,符合字母K的斜向结构。 - 下半部分对称实现:通过从
size-2逆序循环到0,复用和上半部分相同的空格逻辑,快速完成完整K图案的绘制。
示例输入输出
输入:4
输出:
*
*
内容的提问来源于stack exchange,提问作者Johnson
相关产品推荐
相关产品推荐

