在线编译器 C

#include <stdio.h> int main(){ const int N=10; int A[N],B[N]; int i,m=0,j,b=0; for(i=0;i<N;i++){ scanf("%d",&A[i]); } for(i=0;i<N;i++){ int c=0; for(j=0;j<N;j++){ if (A[i]==A[j]) c++; } if (c==1){ B[b]=A[i]; b++;} } for (i=0;i<b;i++){ printf("%d",B[i]); } return 0; }
这段代码的功能是:从输入中读取10个整数,找出其中只出现一次的元素,并按顺序存入数组B中,最后输出这些唯一元素。

代码的主要逻辑是:对于数组A中的每个元素,遍历整个数组统计它出现的次数,如果次数为1,则将其存入数组B。

代码中存在一个逻辑错误。当数组中有重复元素时,对于每个重复元素,都会在遍历到它时将其加入B,但实际应该只加入一次。例如,如果A中有两个相同的数字,那么当遍历到第一个时,统计次数为2,不会加入;但遍历到第二个时,统计次数也是2,也不会加入。这看起来似乎没问题,但考虑更复杂的情况:如果某个数字出现3次,那么遍历到每个该数字时,统计次数都是3,都不会加入,这符合预期。然而,如果某个数字只出现1次,它会被正确加入。所以这个逻辑实际上能正确找出唯一元素,但效率较低。

不过,代码有一个潜在问题:数组B的大小是10,但实际存储的唯一元素数量可能少于10,这没有问题。但如果所有元素都唯一,B会存满10个元素,输出时使用b作为循环上限是正确的。

- 提示1:考虑一下,如果输入的数字中有0,代码会如何处理?数组B的初始值都是0,而b从0开始,如果第一个唯一元素恰好是0,那么B[0]会被赋值为0,但输出时从i=0开始,会输出这个0。但如果没有任何唯一元素,b保持为0,输出循环不会执行,这没问题。但如果唯一元素是0,输出结果中会包含0,这是正确的。所以这里没有明显错误。

- 提示2:代码中变量m被声明但从未使用,可以删除它。另外,变量j在循环内部声明,但外层for循环的j声明是多余的,因为内层for循环的j是重新声明的。这不会导致错误,但可以简化。