You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个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;
}

关键技巧说明

  1. 循环范围统一:将所有需要打印的数字(共num*(num+1)/2个)纳入单个循环,避免嵌套循环。
  2. 无if条件判断:使用C语言的三目运算符(?:)替代if语句,完成状态切换和换行判断——三目运算符属于表达式,不属于if语句范畴,符合要求。
  3. 状态跟踪/数学推导:两种方案分别通过变量跟踪或数学计算,确定每个循环步骤要打印的数字和是否需要换行。

内容的提问来源于stack exchange,提问作者Masterberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:16:03