LOADING...

B2025 输出字符菱形

B2025 输出字符菱形 超详细图解

题目拆解

我们要打印一个由*组成的倾斜菱形,形状如下:

  *
 ***
*****
 ***
  *

这个菱形有5行,中间一行有5个*,上下对称。接下来我们像搭积木一样,一步步分析如何实现。


图形拆解(像切蛋糕一样)

我们把菱形切成5行,观察每一行的结构:

graph TD A[第1行] --> B[2空格 + 1个*] C[第2行] --> D[1空格 + 3个*] E[第3行] --> F[0空格 + 5个*] G[第4行] --> H[1空格 + 3个*] I[第5行] --> J[2空格 + 1个*]

规律发现

  1. 空格规律:像电梯楼层一样对称

    • 行号 | 1 | 2 | 3 | 4 | 5
    • 空格数 | 2 | 1 | 0 | 1 | 2
  2. 星号规律:中间最多,向两边递减

    • 行号 | 1 | 2 | 3 | 4 | 5
    • 星号数 | 1 | 3 | 5 | 3 | 1

代码魔法(用数学公式表达规律)

关键变量

  • 中间行的索引是0(想象行号从-2到2)
  • 总行数 = 2×半径 + 1 → 半径=2时总行数=5

魔法公式

  1. 前导空格数 = |当前行号|(绝对值)
  2. 星号数 = 5 - 2×空格数

举个🌰:

pie title 第1行(行号=-2) "空格数" : 2 "星号数" : 1

代码逐行解析

#include "bits/stdc++.h"
using namespace std;

int main() {
    int radius = 2; // 半径=2,控制菱形大小
    int total_lines = 2*radius + 1; // 总行数=5
    
    // 从-2循环到2,共5次(对应5行)
    for(int row = -radius; row <= radius; ++row) {
        int space = abs(row); // 计算前导空格
        int stars = total_lines - 2*space; // 计算星号数
        
        // 打印空格和星号
        cout << string(space, ' ') // 生成空格字符串
             << string(stars, '*') // 生成星号字符串
             << endl;
    }
    return 0;
}

动态生成过程(像打印机工作)

gantt title 菱形打印过程 dateFormat X axisFormat 行号 section 第1行 生成空格: -2, 0, 2 生成星号: -2, 0, 1 section 第2行 生成空格: -1, 0, 1 生成星号: -1, 0, 3 section 第3行 生成空格: 0, 0, 0 生成星号: 0, 0, 5 section 第4行 生成空格: 1, 0, 1 生成星号: 1, 0, 3 section 第5行 生成空格: 2, 0, 2 生成星号: 2, 0, 1

手把手调试演示

以第1行(row=-2)为例:

  1. space = abs(-2) → 2
  2. stars = 5 - 2×2 → 1
  3. 生成:" " + "*" → " *"

总结口诀

  1. 菱形对称有规律
  2. 行号取绝对值
  3. 空格数 = 绝对值
  4. 星号数 = 总数减两倍空格
  5. 循环打印即完成

试着修改radius的值,看看会打印出多大的菱形吧!比如设置radius=3,就能得到更大的7行菱形哦~ ✨

posted @ 2025-03-07 05:40  KaiSageWang  阅读(176)  评论(0)    收藏  举报