在线编译器 C

#include <stdio.h> int main() { int a[10]; int b[10]; int r = 0; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (int i = 0; i < 10; i++) { int c = 0; for (int j = 0; j < r; j++) { c = 1; break; } if (c == 0) continue; } for (int i = 0; i < 10; i++) { for (int j = i + 1; j < 10; j++) { if (a[i] == a[j]) { printf("%d ", a[i]); b[r] = a[i]; r++; break; } } } return 0; }
这段代码的目的是找出数组 `a` 中重复出现的元素,并存入数组 `b` 中。但代码中存在逻辑错误,导致无法正确去重。

- 第二个循环(`for (int i = 0; i < 10; i++)`)中的内层循环 `for (int j = 0; j < r; j++)` 没有实际作用,因为 `r` 初始为0,循环不会执行,变量 `c` 始终为0,导致 `continue` 跳过后续操作,但这里并没有需要跳过的有效代码。
- 在输出重复元素时,没有检查该元素是否已经被记录到 `b` 中,因此同一个重复值可能会被多次输出和多次存入 `b`。

- 思考一下:当发现 `a[i]` 与 `a[j]` 相等时,如何确保这个值还没有被输出过?可以检查 `b` 数组中是否已经存在该值。
- 第二个循环中的 `c` 变量和 `continue` 语句似乎是为了去重,但实现方式不正确。想一想,在发现重复元素后,应该怎样跳过后续的重复判断?