C语言统计数组重复元素个数方法及示例代码逻辑释义咨询
C语言数组重复元素计数代码逻辑讲解
你贴的代码核心思路是标记已统计的重复项,避免重复计数,以下是逐段拆解:
完整代码
#include <stdio.h> #include <conio.h> int main() { int a[10],i,j,n,c=0 ; printf("Enter size of the array : "); scanf("%d", &n); printf("\nEnter elements in array :\n "); for(i=0; i<n; i++) { printf("\nelement - %d:",i); scanf("%d",&a[i]); } for(i=0; i<n; i++) { if(a[i]!=-1) { for(j=i+1; j<n; j++) { if(a[i]==a[j]) { c++; a[j]=-1; } } } } printf("duplicate numbers in the array: %d", c); return 0; }
代码逐段说明
1. 变量定义与输入模块
- 变量说明:
a[10]:存储用户输入的数组,最大支持10个元素i/j:两层循环的遍历变量n:存储用户输入的数组实际长度c:重复元素计数器,初始值为0
- 输入逻辑:先读取用户输入的数组长度
n,再循环n次依次读取每个数组元素存入a数组。
2. 核心计数逻辑
这里默认约定用户输入的数组中不会出现-1作为有效值,用-1作为「已统计重复项」的标记:
- 外层循环遍历数组的每个下标
i:- 先判断
a[i] != -1:如果当前元素已经被标记为-1,说明它是之前已经统计过的重复项,直接跳过即可 - 如果当前元素未被标记,进入内层循环,从
i的下一个下标j=i+1开始往后遍历所有元素- 只要发现
a[i] == a[j],说明找到了一个和a[i]重复的元素:- 计数器
c加1 - 将
a[j]赋值为-1,标记为已统计,后续外层循环遍历到j位置时就会直接跳过,不会重复计数
- 计数器
- 只要发现
- 先判断
3. 结果输出
最终输出计数器c的值,就是数组中重复元素的总个数。
示例运行验证
假设输入数组为[2,3,2,4,3,2],运行流程如下:
- i=0,a[i]=2未被标记,内层遍历找到j=2、j=5两个和2相等的元素,c变为2,a[2]、a[5]被标记为-1
- i=1,a[i]=3未被标记,内层遍历找到j=4和3相等的元素,c变为3,a[4]被标记为-1
- 后续i=2、4、5位置的元素都是-1,直接跳过
- i=3位置的元素是4,后续没有相等元素,计数不变
最终输出c=3,和实际重复元素个数一致。
注意事项
- 代码默认数组中不存在-1这个有效输入,如果你的场景中-1是有效值,需要更换为其他不会出现的数值作为标记
- 数组最大长度固定为10,如果输入n>10会出现数组越界错误
- 此处统计的是「重复元素的总个数」,不是「有多少种重复的元素」,如果需要统计后者,只需要在内层循环找到第一个重复项时加1后直接break内层循环即可。
内容的提问来源于stack exchange,提问作者Azharuddin
相关产品推荐
相关产品推荐

