Онлайн компилятор C

#include <stdio.h> enum { SIZE = 10 }; int main() { int A[SIZE]; for (int i = 0; i < SIZE; i++) { scanf("%d", &A[i]); } int is_sort = 0; int temp; while (!is_sort) { is_sort = 1; for (int i = 0; i < SIZE - 1; i++) { if (A[i] > A[i + 1]) { temp = A[i]; A[i] = A[i + 1]; A[i + 1] = temp; is_sort = 0; } } } for (int i = 1; i < SIZE - 1; i++) { if (A[i-1] == A[i] && A[i] != A[i + 1]) { printf("%d ", A[i]); } if (A[0] == A[SIZE-1]) { printf("%d ", A[0]); } } return 0; }
这段代码首先读取10个整数存入数组,然后用冒泡排序将它们从小到大排序。排序后,代码试图找出数组中“只出现一次”的元素并打印出来。

代码的逻辑存在几个问题:

- 在循环中判断“只出现一次”的条件时,你使用了 `A[i-1] == A[i] && A[i] != A[i+1]`,这个条件实际上是在找“连续两个相等且与下一个不同”的情况,这并不能正确识别只出现一次的元素。例如,对于数组 [1,2,2,3],这个条件会错误地输出2,而2出现了两次。

- 另外,你在循环内部检查 `A[0] == A[SIZE-1]` 并打印,这个判断应该放在循环外面,否则每次循环都会重复打印。

- 循环的范围是 `i = 1` 到 `SIZE-2`,这样会漏掉对第一个和最后一个元素的单独判断。

提示:
- 重新思考如何判断一个元素在排序后的数组中只出现一次:比较它和前后邻居是否都不相等。
- 注意边界情况,比如第一个元素和最后一个元素需要单独处理,因为它们的邻居较少。