C++ 中打印内部递减模式

2025 年 5 月 15 日 | 阅读 11 分钟

引言

模式打印是编程中的一个基本概念,有助于提高逻辑思维和对嵌套循环的理解。一种特殊的模式是内部递减模式,其中每行的元素数量随着向下移动而逐渐减少。

在此模式中,您通常从第一行固定数量的元素开始。对于每一行,元素数量都会减少一个。元素本身可以是数字、字符或符号,具体取决于要求。这种类型的模式在基础编程练习中很受欢迎,通常用于教导学生如何有效地管理循环和条件。

什么是内部递减模式?

例如,您可能想打印如下内容

此模式显示

  • 第一行有 5 个数字(从 1 到 5)。
  • 第二行有 4 个数字(从 1 到 4)。
  • 每一行比前一行少一个数字。

在 C++ 中创建模式的步骤

理解行和列

  • 模式中的行数等于起始计数(在此例中为 5)。
  • 每一行中的列数随着行号的增加而减少。

使用嵌套循环

  • 外循环控制行。
  • 内循环在每一行中打印数字。

打印数字的逻辑

  • 内循环在每行中运行 n - i 列,其中
  • n 是总行数。
  • i 是当前行(从 0 开始)。

转到下一行

  • 打印完一行后,添加一个换行符以移至下一行。

方法 1:简单方法

示例

输出

Enter the number of rows: 5
1 2 3 4 5 
1 2 3 4 
1 2 3 
1 2 
1   

说明

步骤 1:从用户处获取输入

程序首先要求用户输入行数(n)。此输入决定了模式将有多少行。例如,如果用户输入 5,则模式将有 5 行。这使得程序更加灵活,因为它可以根据用户的输入生成任意大小的模式。

步骤 2:外循环(行)

外循环控制模式中的行数。它从 i = 0 循环到 i < n。每次外循环运行时,它都代表模式的一行。

  • 在第一次迭代(i = 0)中,它处理第一行。
  • 在第二次迭代(i = 1)中,它处理第二行,依此类推。
  • 此循环可确保所有行都逐一打印。

步骤 3:内循环(列)

内循环嵌套在外循环内。它的工作是在每一行中打印数字。

  • 内循环从 j = 1 循环到 j <= n - i。
  • j 从 1 开始,因为模式中的数字始终从 1 开始。
  • 条件 j <= n - i 确保列的数量随着行的进展而减少。

例如

  • 在第一行(i = 0)中,内循环从 1 循环到 5(打印 1 2 3 4 5)。
  • 在第二行(i = 1)中,内循环从 1 循环到 4(打印 1 2 3 4)。
  • 在第三行(i = 2)中,内循环从 1 循环到 3(打印 1 2 3)。

这就是如何管理元素数量的减少。

步骤 4:打印数字

在内循环中,打印每个数字(j)。在打印每个数字后,添加一个空格 (“ ”) 以分隔同一行中的数字。这确保数字并排显示在一行中。

步骤 5:转到下一行

打印完一行中的所有数字后,程序使用 cout << endl; 移至下一行。这确保下一行的数字从新行开始。

步骤 6:重复过程

外循环继续运行,为每一行重复内循环。每一新行,列的数量都会因条件 j <= n - i 而减少。这就是为什么模式看起来像一个三角形,每行后面的数字越来越少。

步骤 7:结束程序

打印完所有行后,程序结束。完整的模式显示在屏幕上。

示例演练

假设用户输入 5

  • 第一行:外循环开始(i = 0),内循环从 j = 1 循环到 5。它打印 1 2 3 4 5。
  • 第二行:外循环继续(i = 1),内循环从 j = 1 循环到 4。它打印 1、2、3 4。
  • 第三行:外循环继续(i = 2),内循环从 j = 1 循环到 3。它打印 1 2 3。
  • 第四行:外循环继续(i = 3),内循环从 j = 1 循环到 2。它打印 1 2。
  • 第五行:外循环继续(i = 4),内循环从 j = 1 循环到 1。它打印 1。

程序完成,最终输出为完整模式。

复杂度分析

时间复杂度

内部递减模式打印的时间复杂度取决于行数(n)以及总共打印的元素数量。

外循环

外循环运行 n 次,为每一行运行一次。

内循环

  • 在第一行中,内循环运行 n 次。
  • 在第二行中,它运行 n-1 次。
  • 在第三行中,它运行 n-2 次,依此类推。

内循环的总迭代次数是 n 到 1 的数字之和

总迭代次数 = n + (n-1) + (n-2) + ... + 1 = n * (n + 1) / 2

这简化为时间复杂度为O(n²)

空间复杂度

该程序仅使用少量变量进行循环和存储输入(n、i、j),因此空间复杂度为 O(1)。

  • 没有使用额外的数据结构,如数组或列表。
  • 无论输入大小如何,程序都只为变量使用恒定的内存。

方法 2:反向循环递减

此方法对内循环使用反向循环,从每行的最大数量开始并递减到 1。它实现了相同的结果,但提供了对循环管理的另一种视角。

示例

输出

Enter the number of rows: 5
1 2 3 4 5 
1 2 3 4 
1 2 3 
1 2 
1   

说明

步骤 1:从用户处获取输入

程序首先要求用户输入行数(n)。n 的值定义了将打印多少行。

例如,如果用户输入 5,则模式将有 5 行。

步骤 2:外循环(行)

外循环从 1 循环到 n,这意味着它将从 i = 1 循环到 n。

  • 变量 i 代表当前行号。
  • 对于第一行,i = 1,对于第二行,i = 2,依此类推,直到 n。
  • 此循环确保我们处理从第一行到最后一行的所有行。

步骤 3:内循环(反向计数)

内循环从 n 循环到 i,其中 n 是当前行中的最大元素数量。

  • 循环从 j = n 开始并递减到 i。
  • 变量 j 代表行内的当前位置,从最大数字开始。
  • 例如,在第一行中,j 从 n 开始并递减到 1。
  • 在第二行中,j 从 n-1 开始并递减到 1。

步骤 4:打印数字

在内循环中,打印数字 (n - j + 1)。

  • 此公式确保数字随着 j 的减小而减小。
  • 例如,在第一行中,j = n 给出 1,j = n-1 给出 2,依此类推。
  • 数字以空格分隔打印。

步骤 5:转到下一行

打印完一行中的所有数字后,程序使用 cout << endl; 移至下一行。

  • 这会创建一个新行,模式继续。

步骤 6:重复过程

外循环从 i = 2 继续到 n,每次递减打印的列数。

  • 对于第二行,i = 2,内循环从 n-1 循环到 1,打印 1 2 3 4。
  • 对于第三行,i = 3,内循环打印 1 2 3。
  • 此模式继续直到最后一行,最后一行只打印 1。

步骤 7:结束程序

打印完所有行后,程序完成,完整的模式显示在屏幕上。

n = 5 的示例演练

  1. 第一行(i = 1):打印从 5 到 1 的数字。
  2. 第二行(i = 2):打印从 4 到 1 的数字。
  3. 第三行(i = 3):打印从 3 到 1 的数字。
  4. 第四行(i = 4):打印从 2 到 1 的数字。
  5. 第五行(i = 5):打印数字 1。

程序以反向递减的顺序显示整个模式,并且此方法保持逻辑清晰高效。

复杂度分析

时间复杂度

  • 外循环运行 n 次,对于外循环的每次迭代,内循环都从 n 循环到 i。
  • 内循环的总迭代次数为
  • 总和 = n + (n-1) + (n-2) + ... + 1 = n * (n + 1) / 2

时间复杂度:O(n²)

空间复杂度

  • 该程序使用常数空间用于变量(i、j 和 n)。
  • 没有使用额外的空间。
  • 空间复杂度:O(1)

方法 3:单循环递减方法

单循环递减方法是一种模式打印技术,我们使用单个循环来减少每一行打印的元素数量。而不是从固定范围打印数字(例如从 n 递减),我们根据当前行逐渐减小范围。此方法简化了逻辑并减少了对嵌套循环的需要,使其在时间和空间复杂度方面都更有效。

示例

输出

Enter the number of rows: 10
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 
1 2 3 4 5 6 
1 2 3 4 5 
1 2 3 4 
1 2 3 
1 2 
1   

说明

步骤 1:从用户处获取输入

  • 程序首先提示用户输入行数(n)。
  • 例如,如果用户输入 5,则模式将有 5 行。

步骤 2:外循环(行)

  • 外循环从 n 递减到 1。
  • 此循环将有助于从顶部(最大行)到底部打印行。
  • 变量 i 代表当前行号。
  • 对于 i = n,它打印具有最大元素数量的最大行。
  • 对于 i = n-1,它打印具有较少元素的第二大行。
  • 这会一直持续到 i = 1。

步骤 3:内循环(打印数字)

  • 内循环在每一行中从 1 循环到 i。
  • 变量 j 代表行内的当前位置。
  • 对于第一行(i = n),j 从 1 循环到 n。
  • 对于第二行(i = n-1),j 从 1 循环到 n-1,依此类推。
  • 这确保我们只打印每一行所需的数字。

步骤 4:打印数字

  • 在内循环中,数字按顺序从 1 打印到 i。
  • 空格分隔每个数字以提高清晰度。
  • 例如,在第一行中,打印从 1 到 n 的数字。
  • 在第二行中,打印从 1 到 n-1 的数字,依此类推。
  • 打印完每一行的数字后,程序打印 endl 以移至下一行。

步骤 5:完成行

外循环继续将 i 从 n 递减到 1。

i 的每次迭代都确保每一行打印的数字更少。

例如

  • 第一行(i = n):1 2 3 4 5
  • 第二行(i = n-1):1 2 3 4
  • 第三行(i = n-2):1 2 3
  • 第四行(i = n-3):1 2
  • 第五行(i = 1):1

这样,我们每一行打印的数字都更少。

步骤 6:程序结束

  • 打印完所有行后,程序结束,完整的模式显示出来。

复杂度分析

时间复杂度

  • 外循环从 n 递减到 1,即 n 次迭代。
  • 对于每一行,内循环从 1 循环到 i。
  • 总操作次数
  • 总和 = 1 + 2 + 3 + ... + n = n * (n + 1) / 2 = O(n²)

时间复杂度:O(n²)

空间复杂度

  • 程序使用恒定空间用于变量(i、j 和 n)。
  • 除了这些变量之外,没有使用额外的空间。
  • 空间复杂度:O(1)