如何修改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
相关产品推荐
相关产品推荐

