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

如何修改C语言代码使输出末尾无多余制表符仅以换行符结束

C语言3n+1序列输出末尾多余制表符修复方案

问题背景

现有实现角谷猜想(3n+1)序列输出的C代码,输出规则要求为:

  • 读取输入整数n,输出从n开始到1的完整3n+1计算序列
  • 相邻数字之间用制表符\t分隔
  • 每输出10个数字执行一次换行
    当前代码存在逻辑缺陷:每个数字输出时都会尾随打印制表符,导致最后一个数字末尾残留多余制表符,不符合输出规范。
    原有问题代码如下:
#include <stdio.h>

int main(void) {

   int n;
   int f=0;
   
    scanf("%d",&n);
    printf("%d\t",n);
    
    while(n != 1) {

        if (n % 2 == 0) {
            n = n / 2;
        }
        else {
            n = (n * 3) + 1;
        }
        if (f == 9) {
            printf("\n%d\t", n);
        }
        else {
            printf("%d\t", n);
        } 
        f = (f + 1) % 10;
        
    }
    printf("\n");

   return 0;
}

修复思路

核心问题是原有逻辑把分隔符(制表符、换行符)绑定在数字后面打印,无法区分当前数字是不是行尾、是不是整个序列的最后一个值,很容易留下多余分隔符。调整为分隔符前置打印逻辑即可从根源解决问题:

  • 第一个数字直接输出,不前置任何分隔符
  • 后续每准备输出一个新数字前,先判断当前行已输出的数字数量:如果已经满10个,先打印换行;如果没满,先打印制表符和前一个数字分隔
  • 所有数字单独打印时不尾随任何分隔符
  • 整个序列输出完成后,统一打印一个换行符收尾

修复后完整代码

#include <stdio.h>

int main(void) {
    int n;
    // f记录当前行已经输出的数字个数
    int f = 0;

    scanf("%d", &n);
    // 输出第一个数字,不带尾随分隔符
    printf("%d", n);
    f++;

    while (n != 1) {
        // 计算3n+1序列的下一个值
        if (n % 2 == 0) {
            n = n / 2;
        } else {
            n = n * 3 + 1;
        }

        // 前置打印分隔符:满10个先换行,否则打印制表符
        if (f == 10) {
            printf("\n");
            f = 0;
        } else {
            printf("\t");
        }
        // 输出当前数字
        printf("%d", n);
        f++;
    }
    // 最终以换行符收尾
    printf("\n");

    return 0;
}

修复效果

修复后输出的数字之间只会在相邻位置打印制表符,每10个数字正常换行,最后一个数字1后面不会残留多余制表符,整个输出的末尾只有一个要求的换行符,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:27:42