CC++ & Algorithm

别再只会用 for 循环数数了!用星号画个“2”,解锁循环嵌套的隐藏技能

2026年6月16日关联知识点:C++ for 循环基础38 次阅读

你有没有想过,在 C++ 控制台里用星号画出一个标准的数字“2”?这不是个简单的任务——它要求你精确控制每一行输出多少个星号、多少个空格,而且整个图形要像真正的数字 2 那样有弧度、有直线。但别担心,for 循环就是你手中最锋利的画笔。

先抛开画图不谈,for 循环的本质其实就是一个“自动计数器”。你告诉它从哪开始、到哪结束、每次怎么变,它就老老实实帮你重复执行一段代码。就像小时候跳绳,每跳一下数一个数,跳完 5 次就停。代码写出来就是:

for (int i = 1; i <= 5; i++) {
    cout << i << " ";
}

输出 1 2 3 4 5。简单得像个玩具。

但玩具能变成武器吗?能。你只需要把循环体里的 cout << i 换成输出星号,再套上另一个循环来控制行数,一个二维图形就诞生了。

用两个 for 循环,画出一个“2”

题目要求输入一个整数 n(3≤n≤100),输出一个由 * 组成的长宽都为 n 的“2”字图形。看样例 n=5 时输出的形状,其实就是字母 Z 的加粗版——顶部一行全是星号,底部一行全是星号,中间是一条从右上到左下的对角线。

问题的核心在于:如何用循环描述“第 i 行应该输出哪些星号”?

你可能会想到数学上的分段函数:第一行全部输出,最后一行全部输出,中间的行只在特定位置输出星号(比如对角线上的点)。但仔细看样例,图形并不是简单的“中间一行只有一个星号”——它其实是一个实心的数字 2 轮廓:顶部横线、右侧竖线、中间横线、左侧竖线、底部横线。简化版就是先画一个 Z 字形的边框。

一个更通用的方法:把问题拆成“行”和“列”两个维度,用外层循环控制行号 i(从 0 到 n-1),内层循环控制列号 j(从 0 到 n-1)。然后判断当前坐标 (i, j) 是否属于“2”的图案区域,是就输出 *,否则输出空格。

比如 n=5 时,图案可以分解为:

  • 第一行(i=0):全部是 *
  • 最后一行(i=n-1):全部是 *
  • 中间行:满足 i+1 == n-1 - j(即对角线上的点,或者更准确地说,是 Z 字形的斜线)时输出 *

但实际题目的样例输出中,n=5 的图案看起来是一个加粗的 2,而不是简单的 Z 字形。所以更精确的判断条件是:当 i == 0 或 i == n-1 或 i+j == n-1 时输出 *,其余输出空格。这正好对应了字母 Z 的拓扑结构。

于是代码骨架就出来了:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        if (i == 0 || i == n-1 || i + j == n-1)
            cout << '*';
        else
            cout << ' ';
    }
    cout << endl;
}

看到没?两个 for 循环嵌套,一个 if 条件判断,一个“2”字就打印出来了。这就是 for 循环从“数数”到“画图”的跃升。你不再只是让它输出数字,而是让它把数字变成坐标,再变成图案。

剪绳子的数学:for 循环不只是计数,还能算幂

另一个经典题目也暗藏 for 循环的妙用。一根绳子,对折 n 次后从中间剪一刀,能剪出多少段?只有 n=1 时是 3 段,n=2 时是 5 段,n=3 时是 9 段……规律就是 段数 = 2^n + 1(n≥1)。验证一下:n=1 → 2^1+1=3,n=2 → 5,n=3 → 9,正确。

你可以直接用数学公式写一行代码 pow(2, n) + 1,但题目考察的初衷往往是想让你动手用循环累乘计算 2 的 n 次方,同时理解循环的迭代过程:

int result = 1;
for (int i = 1; i <= n; i++) {
    result = result * 2;
}
cout << result + 1;

这恰好是 for 循环从“简单递增”到“乘法累乘”的升级:每次循环体里做的操作不只是加 1,也可以是乘 2。循环变量 i 从 1 走到 n,控制迭代次数,而真正的计算则累积在 result 上。这种模式在算法中太常见了——斐波那契数列、阶乘、幂运算,全是同一个套路。

循环次数和省略写法:你以为你懂了,但面试官会问

回到基础,下面这段代码循环体执行几次?

for (int i = 1; i <= 5; i++) { cout << i; }

答案:5 次(i 从 1 到 5)。如果改成 i < 5,就是 4 次。这是每一个初学者都会掉进去的陷阱:边界条件的处理。很多编程 bug 就出在少一次或多一次循环上。

更有趣的是,for 循环的三个表达式都可以省略,唯独两个分号必须保留。比如:

int i = 1;
for (; i <= 5; ) {
    cout << i;
    i++;
}

这其实等价于一个 while 循环。你甚至可以把所有表达式都写成空,变成一个死循环 for(;;),这在某些需要手动 break 的场景下非常实用。但请注意,省略初始化表达式意味着变量 i 必须在循环外部定义,否则作用域会出问题——这也是很多新手写出“变量未定义”错误的根源。

总结:把 for 循环当成“可控的重复”

从数 1 到 5 的跳绳开始,到用嵌套循环画出字母图形,再到用累乘计算 2 的幂,本质上都在做同一件事:用循环变量作为“指针”或“计数器”,控制重复的次数或迭代的状态。而选择什么样的循环体,决定了这个工具能产生多大的威力。

如果你已经掌握了 for 循环的基本写法,接下来的进阶方向可以是:

  • 嵌套循环的复杂度分析(比如 O(n²) 的图形打印)
  • 循环中的 break 和 continue 如何改变流程
  • 用循环实现动态规划(比如剪绳子问题其实也可以用递推,但循环更直观)

至于画“2”,你大可以挑战画其他数字、字母,甚至用循环生成 ASCII 艺术图——那时候你会发现,当初那个只会数数的跳绳工具,已经变成了可以创造视觉奇观的画笔。

这篇文章对你有帮助吗?

有用 100%没用 0%

想系统学习这个知识点?查看完整知识点 →