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

#include <stdio.h> int main() { int a[10]; int i, j, k; int is; int alr; for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (i = 0; i < 10; i++) { is = 0; for (j = 0; j < 10; j++) { if (i != j && a[i] == a[j]) { is = 1; break; } } if (!is) continue; alr = 0; for (k = 0; k < i; k++) { if (a[k] == a[i]) { alr = 1; break; } if (!alr) { printf("%d ", a[i]); } } } return 0; }
这段代码试图找出数组中重复出现的元素并打印出来,但存在逻辑错误。

代码的思路是:对于每个元素,先检查它是否有重复(通过内层循环j),如果有重复,再检查它是否已经被打印过(通过循环k),如果没有被打印过就输出。但问题出在检查是否已打印的循环结构上。

- 第一个问题:在检查是否已打印的循环中,`if (!alr)` 这个判断被放在了循环内部,导致每次循环都会判断一次,而不是在循环结束后统一判断。这会造成输出逻辑混乱,可能输出多次或错误输出。
- 第二个问题:当 `alr` 被设置为1后,循环并没有立即停止,但后续的 `if (!alr)` 判断仍然会执行,这会导致即使已经标记为已打印,仍然可能输出元素。

建议你重新思考如何正确记录哪些重复元素已经被输出过。可以尝试用一个单独的数组来标记每个元素是否已经被处理过,或者调整循环的顺序和判断的位置。