You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言统计数组元素频率时如何处理负数以正确输出重复元素

问题描述

我尝试通过循环判断给定数组中的唯一元素和重复元素,并输出对应出现频次,代码如下:

#include <stdio.h>
#define Frequency_size 10000
#define N 20
void unique_numbers(int array[], int n){
   int i,j;
   int count = 0;
   printf("List of unique numbers: ");
   for(i = 0; i < n; i++){
      for(j = 0; j < n; j++){
         if(array[i] == array[j] && i != j)
         break;
      }
      
      if(j == n ){
         printf("%d ",array[i]);
         ++count;
      }
   }
   printf("\n");
   printf("Element count in List of Unique Numbers = %d", count);
}


void non_unique_numbers(int arr[], int size)
{
    int i;
    int freq;
    int totdup = 0;

    int frequency[Frequency_size] = { 0 };
printf("List of Duplicated Numbers: \n");

    for (i = 0; i < size; i++)
        ++frequency[arr[i]];

    for (i = 0; i < Frequency_size ; i++) {
        freq = frequency[i];
        if (freq <= 1)
            continue;

        printf("Number: %d  , Frequency: %d\n", i, freq);

        if (freq >= 2)
            ++totdup;
    }

    printf("Element Count in List of Duplicated Numbers = %d",totdup);
    
}


int main(){
    int array[]={41, 47, 23, -62, -52, 15, 41, -88, 90, -62, -40, 37, 34, 88, 26, -54, 53, 15, 41, 46};
    unique_numbers(array, N);
    printf("\n\n\n\n");
    non_unique_numbers(array, N);
}

运行后输出结果如下:

List of unique numbers: 47 23 -52 -88 90 -40 37 34 88 26 -54 53 46 
Element count in List of Unique Numbers = 13




List of Duplicated Numbers:
Number: 15  , Frequency: 2
Number: 41  , Frequency: 3
Element Count in List of Duplicated Numbers = 2

但数组中-62实际重复出现了2次,输出中并没有展示,问题原因是无法处理数组中的负数。
期望输出如下:

List of Duplicated Numbers:
Number: 15  , Frequency: 2
Number: 41  , Frequency: 3
Number: -62  , Frequency: 2
Element Count in List of Duplicated Numbers = 3

要求仅使用for循环实现,该如何修改?

解决方案

问题根因

原代码的non_unique_numbers函数直接用数组元素的值作为frequency数组的下标,C语言中数组下标不能为负数,负数访问数组属于越界的未定义行为,因此负数的出现频次没有被正确统计。

仅用for循环的修改方案

我们可以不用频次数组,改用两层for循环遍历数组统计每个元素的出现次数,同时对已经统计过的元素做跳过处理,避免重复输出,完全符合仅用for循环的要求,修改后的完整代码如下:

#include <stdio.h>
#define N 20
void unique_numbers(int array[], int n){
   int i,j;
   int count = 0;
   printf("List of unique numbers: ");
   for(i = 0; i < n; i++){
      for(j = 0; j < n; j++){
         if(array[i] == array[j] && i != j)
         break;
      }
      
      if(j == n ){
         printf("%d ",array[i]);
         ++count;
      }
   }
   printf("\n");
   printf("Element count in List of Unique Numbers = %d", count);
}


void non_unique_numbers(int arr[], int size)
{
    int i,j,freq,totdup = 0;
    // 标记已经统计过的元素,避免重复输出
    int counted[size] = {0};
    printf("List of Duplicated Numbers: \n");

    for (i = 0; i < size; i++){
        // 已经统计过的元素直接跳过
        if(counted[i]) continue;
        freq = 1;
        for(j = i+1; j < size; j++){
            if(arr[i] == arr[j]){
                freq++;
                counted[j] = 1;
            }
        }
        if(freq >=2){
            printf("Number: %d  , Frequency: %d\n", arr[i], freq);
            totdup++;
        }
    }

    printf("Element Count in List of Duplicated Numbers = %d",totdup);
    
}


int main(){
    int array[]={41, 47, 23, -62, -52, 15, 41, -88, 90, -62, -40, 37, 34, 88, 26, -54, 53, 15, 41, 46};
    unique_numbers(array, N);
    printf("\n\n\n\n");
    non_unique_numbers(array, N);
}

修改后运行代码即可得到期望输出,负数的重复频次可以正常统计。

内容的提问来源于stack exchange,提问作者goku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:54:03