C语言代码输出错误数值:为何结果与预期不符?
C语言查找缺失数字的错误修复
需求说明
读取第一行的两个整数m和n,接着读取长度为n的数组;检查1到m的数字是否存在于该数组中,输出所有不存在的数字。
问题场景
示例输入:
3 3 1 2 4
预期输出:3(注:原描述中预期输出写为4属于笔误,根据m=3,检查范围是1-3,数组中缺失的是3)
实际输出:1122333
原代码错误分析
#include <stdio.h> int main() { int m = 0; int n; int i , j; int x[100]; scanf("%d", &m); scanf("%d", &n); for(i = 0 ;i < n;i++) { scanf("%d", &x[i]); } for(j = 1;j <= m;j++) { for(i = 0; i < n;i++) { if(x[i] != j) { printf("%d", j); } } } }
核心错误在于逻辑判断逻辑颠倒且触发条件错误:
- 原代码中,只要数组元素不等于当前j就打印j,导致每个j会被多次打印(数组中有多少个不等于j的元素,就打印多少次j)。比如j=1时,数组中2、4不等于1,就会打印两次1;j=3时,数组中所有元素都不等于3,就会打印三次3,最终输出
1122333。 - 输入读取可优化:原代码用两次
scanf读取m和n,虽能运行,但合并为一次读取更符合第一行输入两个整数的场景。
修复后的代码
#include <stdio.h> int main() { int m, n; int i, j; int x[100]; // 一次性读取第一行的两个整数 scanf("%d %d", &m, &n); for(i = 0; i < n; i++) { scanf("%d", &x[i]); } // 遍历1到m的每个数字,检查是否存在 for(j = 1; j <= m; j++) { int exists = 0; // 标记当前数字是否存在于数组 for(i = 0; i < n; i++) { if(x[i] == j) { exists = 1; break; // 找到匹配项后直接跳出循环,减少不必要遍历 } } // 仅当数字不存在时打印 if(!exists) { printf("%d\n", j); } } return 0; }
修复说明
- 输入读取优化:将两次
scanf合并为scanf("%d %d", &m, &n);,更贴合第一行输入两个整数的场景,避免潜在的输入处理问题。 - 增加存在标记:对每个待检查的数字j,用
exists变量标记是否在数组中找到匹配项,找到后立即跳出内层循环,提升效率。 - 正确控制打印时机:只有当遍历完整个数组都未找到j时,才打印该数字,确保每个缺失数字仅输出一次。
内容的提问来源于stack exchange,提问作者code
相关产品推荐
相关产品推荐

