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
相关产品推荐
相关产品推荐

