如何用单个for循环且无if语句打印指定数字图案?
单个for循环+无if语句实现指定数字图案打印
方案一:基于状态跟踪的实现
这种方法通过变量跟踪当前行和数字,利用三目运算符替代if进行状态切换,逻辑直观易懂:
#include <stdio.h> int main() { int num = 3; // 对应输出3行图案 int current_line = 1; int current_digit = current_line; // 循环次数等于所有数字的总数:num*(num+1)/2 for (int count = 1; count <= num*(num+1)/2; count++) { printf("%d", current_digit); // 切换下一个数字:当前是1则跳转到下一行起始,否则数字减1 current_digit = (current_digit == 1) ? current_line + 1 : current_digit - 1; // 行尾换行:仅当切换到下一行起始时打印换行 printf("%s", (current_digit == current_line + 1) ? "\n" : ""); // 更新行号:仅在切换到下一行时递增 current_line = (current_digit == current_line + 1) ? current_line + 1 : current_line; } return 0; }
方案二:基于数学推导的实现
通过数学公式直接计算每个循环位置对应的行号和数字,无需额外状态变量:
#include <stdio.h> #include <math.h> int main() { int num = 3; // 遍历所有要打印的数字 for (int k = 1; k <= num*(num+1)/2; k++) { // 计算当前数字所在的行号i int i = (int)(sqrt(8 * k + 1) + 1) / 2; // 计算当前要打印的数字:行号减去当前在本行的偏移量加1 int digit = i - (k - i*(i-1)/2 - 1); printf("%d", digit); // 行尾换行:利用三目运算符判断是否为行末 printf("%s", (k == i*(i+1)/2) ? "\n" : ""); } return 0; }
关键技巧说明
- 循环范围统一:将所有需要打印的数字(共
num*(num+1)/2个)纳入单个循环,避免嵌套循环。 - 无if条件判断:使用C语言的三目运算符(
?:)替代if语句,完成状态切换和换行判断——三目运算符属于表达式,不属于if语句范畴,符合要求。 - 状态跟踪/数学推导:两种方案分别通过变量跟踪或数学计算,确定每个循环步骤要打印的数字和是否需要换行。
内容的提问来源于stack exchange,提问作者Masterberg
相关产品推荐
相关产品推荐

