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

#include <stdio.h> enum{p = 10}; int main() { int A[p], cymma=0; for(int i = 0; i < p; i++) { scanf ("%d", &A[i]); } int be = 0; while(be == 0){ be = 1; for(int i = 0; i < p-1; i++) { if (A[i] > A[i+1]) { int t= A[i+1]; A[i+1] = A[i]; A[i] = t; be = 0; } } } int j =A[0]+1; for(int i = 0; i < p-1; i++) { if (A[i] == A[i+1]) { if (j== A[0]){ break; } j =A[i+1]; cymma++; } } int B[cymma]; int k = 0; for(int i = 0; i < p-1; i++) { if (A[i] == A[i+1]) { if (j== A[0]){ break; } B[k] =A[i+1]; } k++; } for(int i = 0; i < cymma; i++) { printf ("%d ", B[i]); } return 0; }
这段代码的目的是:输入10个整数,找出其中所有重复出现的数字(即出现至少两次的数字),并将这些重复数字输出一次。

代码首先对数组进行冒泡排序,然后尝试找出相邻相等的元素作为重复数字。但代码中存在逻辑错误,导致结果不正确。

- 变量 `j` 的初始值设为 `A[0]+1`,这个值可能并不在数组中,后续用它来跳过重复输出,但判断条件 `j == A[0]` 只在特定情况下成立,无法正确避免重复输出。
- 在第二个循环中,当发现相邻相等时,`j` 被更新为当前重复值,但 `j` 的初始值不是数组中的元素,导致第一次遇到重复时不会触发 `break`,但后续逻辑依然混乱。
- 第三个循环中,`k` 的递增位置不正确:无论是否遇到重复,`k` 都会增加,导致数组 `B` 的索引错位,可能覆盖或跳过元素。

提示:
- 思考如何用一个变量记录“上一个已经处理过的重复数字”,确保每个重复数字只被记录一次。这个变量的初始值应该设为数组里不可能出现的值,比如 `A[0] - 1`。
- 注意在填充数组 `B` 时,只有遇到新的重复数字才应该增加索引 `k`,而不是每次循环都增加。