Online Compiler C

#include <stdio.h> int find_missing(int n, int a[]) { int min = a[0]; for (int i = 0; i < n; i++) { if (a[i] < min) { min = a[i]; } } int c[n] = {0}; for (int t = 0;t < n;t++) { for (int i = min; i < min + n; i++) { if (i != a[t]) { c[t]++; } } } int i = 0; while (i < n) { if (c[i] == n) { break; } i++; } return i+min; } int main() { int a[1000], answer; while (scanf("%d", a)) { answer = find_missing(10, a); } printf("%d", answer); return 0; }
这段代码试图找出一个长度为n的数组中缺失的那个整数,假设数组包含从某个最小值开始的连续n+1个整数中的n个。但代码中有几个逻辑问题。

主要问题在于内层循环的逻辑:它试图统计每个候选数是否与数组中的每个元素都不相等,但实现方式不正确。`c[t]` 的计数方式没有正确反映缺失的数字。

- 内层循环 `for (int i = min; i < min + n; i++)` 遍历了从最小值开始的n个连续整数,但每次比较 `i != a[t]` 时,只要i不等于当前数组元素就增加计数,这会导致 `c[t]` 的值总是n-1(因为只有一个i等于a[t]),而不是你想要的“缺失的那个数从未出现”的计数。你需要重新思考如何标记每个候选数是否在数组中出现过。

- 另外,`while (scanf("%d", a))` 的用法有问题:`scanf` 返回成功读取的元素个数,当输入结束时返回EOF(通常为-1),而-1在条件判断中为真,会导致无限循环。你需要检查返回值是否为1,或者使用其他方式控制输入结束。