在线编译器 C

#include <stdio.h> int main() { int a[10]; int m = 0; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (int i = 0; i < 10; i++) { m = 0; for (int j = 0; j < 10-i; j++) { if (a[i] == a[j]) { m ++; } } if (m > 1) { printf("%d ", a[i]); } } return 0; }
这段代码试图找出数组中重复出现的元素并打印出来,但逻辑上有问题。它用两层循环,外层遍历每个元素,内层统计该元素出现的次数,但内层循环的边界和比较逻辑不正确,导致结果可能错误或重复输出。

- 内层循环 `for (int j = 0; j < 10-i; j++)` 的结束条件 `10-i` 会随着外层 `i` 增大而缩小,导致只检查数组的前半部分,漏掉后面的元素。应该遍历整个数组来统计次数。
- 当 `i` 和 `j` 指向同一个元素时(即 `i == j`),也会被计入,导致每个元素至少计数一次。需要跳过自身比较,或者调整计数逻辑。
- 另外,如果某个元素出现多次,每次遇到它都会打印一次,导致重复输出。可以考虑只打印第一次发现重复时的元素,或者用标记避免重复。