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

#include <stdio.h> int main() { int a[10]; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (int i = 0; i < 10; i++) { for (int j = i + 1; j < 10; j++) { if (a[i] == a[j]) { printf("%d ", a[i]); for(int n=0;n<10;n++){ if(a[n]==a[i]){ a[n]=-1; } } //printf("%d ", a[i]); break; } } } return 0; }
这段代码的功能是:读取10个整数,然后输出其中所有重复出现的数字(每个重复数字只输出一次)。它通过将已输出的重复数字标记为-1来避免重复输出。

你的代码有一个逻辑问题:当找到重复数字时,你立即将数组中所有等于该数字的元素都改为-1,但此时外层循环还在继续,后续的外层循环可能会错误地处理这些被修改的元素。

- 外层循环变量i遍历数组时,如果a[i]已经被标记为-1,那么内层循环中a[i] == a[j]的判断会失效,但更重要的是,当a[i]本身是-1时,它可能与其他-1值误判为重复。
- 考虑一下:当a[i]被改为-1后,后续的外层循环中i继续增加,如果后面某个元素原本就是-1(比如用户输入了-1),或者被标记为-1,那么程序可能会错误地输出-1作为重复数字。