多测试用例下判断数字含7出错:为何所有输入均输出YES?
错误原因分析与修复方案
核心问题:未初始化的局部变量flag
你这段代码的问题出在**flag变量没有初始化**。在C语言里,局部变量如果不手动赋值,会包含随机的垃圾值:
- 如果第一个测试用例的数字包含7,
flag会被设为1;后续测试用例哪怕数字不含7,flag也不会被修改,依然保留之前的1,导致错误输出YES。 - 要是第一个测试用例的数字不含7,
flag的初始垃圾值也可能恰好是1,照样会误输出YES。
而移除多测试用例循环后,程序只跑一次,可能刚好垃圾值是0(或者你测试的第一个数字刚好含7),所以看起来正常,但这完全是偶然,逻辑根本不对。
修复后的代码
只需要给flag初始化为0,保证每次处理新测试用例时,初始状态都是“未找到7”:
#include <stdio.h> int main() { int T; scanf("%d", &T); while (T != 0) { int X; scanf("%d", &X); // 初始化flag为0,明确初始状态是未找到7 int flag = 0, result; while (X != 0) { result = X % 10; if (result == 7) { flag = 1; } X = X / 10; } if (flag == 1) { puts("YES"); } else { puts("NO"); } T--; } return 0; }
额外优化建议
可以在找到7后直接跳出内层循环,不用继续遍历数字的每一位,能提升一点效率:
while (X != 0) { result = X % 10; if (result == 7) { flag = 1; // 找到7就直接退出循环,没必要再检查剩下的位 break; } X = X / 10; }
内容的提问来源于stack exchange,提问作者Bharath R
相关产品推荐
相关产品推荐

