分析

(图片来源网络,侵删)
你给出的序列是:1 1 2 1 2 3
我们可以把这个序列拆分成三行来看,这样规律就非常明显了:
第1行: 1
第2行: 1 2
第3行: 1 2 3
规律是:打印 n 行,第 i 行打印从 1 到 i 的数字。
下面我将提供几种不同的C语言实现方法,从最直接到更巧妙的方式。

(图片来源网络,侵删)
使用两个 for 循环(最经典、最易理解)
这是解决此类问题最标准、最推荐的方法,一个外层循环控制行数,一个内层循环控制每行的数字。
代码实现
#include <stdio.h>
int main() {
int i, j; // 定义循环变量 i 控制行, j 控制列(数字)
// 外层循环,控制总共有多少行 (从 1 到 3)
for (i = 1; i <= 3; i++) {
// 内层循环,控制当前行打印多少个数字 (从 1 到 i)
for (j = 1; j <= i; j++) {
printf("%d ", j); // 打印数字 j,后面跟一个空格
}
// 内层循环结束后,打印一个换行符,以便开始下一行
printf("\n");
}
return 0;
}
代码详解
#include <stdio.h>: 引入标准输入输出库,因为我们使用了printf函数。int main(): 程序的入口函数。int i, j;: 定义两个整型变量i和j,作为循环的计数器。- 外层
for (i = 1; i <= 3; i++):i = 1: 初始化,从第1行开始。i <= 3: 循环条件,总共打印3行。i++: 每次循环结束后,i的值加1,进入下一行。
- 内层
for (j = 1; j <= i; j++):- 这个循环的次数由外层循环的变量
i决定。 - 当
i = 1时,内层循环j从1到1,只执行一次,打印1。 - 当
i = 2时,内层循环j从1到2,执行两次,打印1 2。 - 当
i = 3时,内层循环j从1到3,执行三次,打印1 2 3。
- 这个循环的次数由外层循环的变量
printf("%d ", j);: 打印当前内层循环的数字j,并在后面加一个空格,让数字之间分开。printf("\n");: 在每行数字打印完毕后,输出一个“换行符”,这样光标就会移动到下一行的开头,准备打印下一行的内容。
输出结果
1
1 2
1 2 3
使用 while 循环
for 循环和 while 循环在很多情况下可以互相转换,下面是使用 while 循环的实现,逻辑是完全一样的。
代码实现
#include <stdio.h>
int main() {
int i = 1; // 行计数器
// 外层 while 循环,控制行数
while (i <= 3) {
int j = 1; // 列(数字)计数器,注意:j的初始化放在这里,确保每行都从1开始
// 内层 while 循环,控制每行的数字
while (j <= i) {
printf("%d ", j);
j++; // 数字递增
}
printf("\n"); // 换行
i++; // 行递增
}
return 0;
}
单循环实现(技巧性更强)
我们也可以用一个循环来完成这个任务,这需要我们手动维护一个“当前行”和“当前数字”的状态。
代码实现
#include <stdio.h>
int main() {
int i = 1; // 当前要打印的数字
int line = 1; // 当前行号
// 循环6次,因为总共有6个数字
for (int k = 0; k < 6; k++) {
printf("%d ", i);
// 如果当前数字等于当前行号,说明这一行结束了
if (i == line) {
printf("\n"); // 换行
line++; // 行号加1
i = 0; // 重置数字,以便下一行从1开始
}
i++; // 数字递增
}
return 0;
}
逻辑分析
这个方法用一个循环变量 k 来控制总共要打印的次数(6次),我们用 i 来追踪当前要打印的数字,用 line 来追踪当前是第几行。

(图片来源网络,侵删)
- 当
i和line相等时(i=1, line=1),打印完1后,就知道第一行结束了,于是换行,line变成2,并把i重置为0,这样i++后就从1开始了。 - 这个方法不如嵌套循环直观,但在某些特定场景下可能会用到。
对于“1 1 2 1 2 3”这类有规律的图形或数字输出问题,使用嵌套的 for 循环是首选方案,因为它最能清晰地反映出“行”和“列”的逻辑关系,代码可读性最高。
