众数和中位数

简介: 众数和中位数

题目

众数是指一组数据中出现次数多的数

众数可以是多个

中位数是指把一组数据从小到大排列,最中间的那个数,

如果这组数据的个数是奇数,那最中间那个就是中位数

如果这组数据的个数为偶数,那就把中间的两个数之和除以 2 就是中位数

查找整型数组中元素的众数并组成一个新的数组

求新数组的中位数

输入

输入一个一维整型数组,数组大小取值范围 0 < n < 1000

数组中每个元素取值范围, 0 < e < 1000

输出

输出众数组成的新数组的中位数

示例一

输入

10 11 21 19 21 17 21 16 21 18 16

输出

21

众数组成的新数组:21

众数组成的新数组的中位数:21

示例二

输入

2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4

输出

3

众数组成的新数组:2 4

众数组成的新数组的中位数:3

示例三

输入

5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39

输出

7

众数组成的新数组:5 7 9

众数组成的新数组的中位数:7

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_INTS 100
void solveMethod(char *line){
    int tmp;
    int arr[MAX_INTS]={0};//c语言中 适用于静态数组
    char *token=strtok(line," ");
    //token是一个指向字符类型的指针变量。它并不直接存储字符,而是存储一个地址,该地址指向一个字符或一串字符(即字符串)的第一个字符的内存位置。
    //处理字符串 ,读取一行以空格分隔的整数。
    while(token!=NULL){
        sscanf(token,"%d",&tmp);//告诉函数将读取到的整数值存储到 tmp 变量所在的内存位置。修改变量 tmp 的值
        arr[tmp]++;
        token=strtok(NULL," ");//传递的是 NULL,则意味着 strtok() 应该从上次调用的位置继续分割
    }
    //统计数字出现频率:
    int max=0;
    for(int i=0;i<MAX_INTS;++i){
        if(arr[i]>max){
            max=arr[i];//计算arr中的元素出现最多出现多少次 
        }
    }
    //找出出现频率最高的数字并存入新数组:
    int newarr[MAX_INTS]={0};
    int j=0;
    for(int i=0;i<MAX_INTS;++i){
        if(arr[i]==max){//出现次数最多的几个数
            newarr[j++]=i;//newArr是包含众数的数列 (递增有序)
        }
    }
    //计算中位数:
    int size=j;
    int res=0;
    if(size%2==0){
        res=(newarr[size/2]+newarr[size/2-1])/2;
    }
    else{
        res=newarr[size/2];
    } 
    printf("%d\n",res);
}
int main(){
    char line[1000];
    fgets(line,1000,stdin);//用于从指定的文件流(如标准输入 stdin)读取一行文本数据并存入缓冲区。
    line[strcspn(line,"\n")]=0;//从用户输入的一行文本中删除末尾的换行符。将换行符赋值为 0,即空字符
    solveMethod(line);
    return 0;
}

运行结果:

解释

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

  • 这些行包含了标准输入输出库(stdio.h)、标准库(stdlib.h)和字符串处理库(string.h),它们提供了用于输入输出、内存分配、字符串操作等功能的函数。

#define MAX_INTS 100

  • 这定义了一个常量 MAX_INTS,表示数组的最大大小为 100。

函数内部的代码:

  1. 统计数字出现频率:
  • 创建一个整数数组 arr 来存储每个数字出现的次数。
  • 使用 strtok 函数将输入字符串 line 分割成以空格分隔的数字。
  • 遍历每个数字:
  • 使用 sscanf 函数将字符串转换为整数。
  • 将对应数字在 arr 数组中的计数加 1。
  1. 找出出现频率最高的数字并存入新数组:
  • 找到 arr 数组中的最大值 max,代表出现频率最高的数字。
  • 创建一个新的数组 newarr 来存储出现频率最高的数字。
  • 遍历 arr 数组,将出现频率为 max 的数字存入 newarr 数组。
  1. 计算中位数:
  • 如果 newarr 数组中的元素个数为偶数,则中位数为中间两个元素的平均值。
  • 如果 newarr 数组中的元素个数为奇数,则中位数为中间元素的值。
  • 计算出中位数并存入 res 变量中。
  1. 打印中位数:
  • 使用 printf 函数打印 res 变量的值,即中位数。

主函数main:

  • 读取输入字符串:
  • 声明一个字符串 line 来存储输入的数字。
  • 使用 fgets 函数从标准输入中读取一行字符串并存入 line 变量中。
  • 使用 strcspn 函数去除 line 字符串末尾的换行符。
  • 调用函数并返回:
  • 调用 solveMethod 函数来处理输入字符串 line 并计算中位数。
  • 返回 0 表示程序正常退出。

总结一下,这个程序的作用是:

  1. 读取一行以空格分隔的整数。
  2. 统计每个数字出现的频率。
  3. 找出出现频率最高的数字。
  4. 计算这些数字的中位数。
  5. 打印中位数。
相关文章
|
6月前
|
算法 C语言
分治法——找众数
分治法——找众数
|
11月前
|
算法 测试技术 C#
C++前缀和算法的应用:统计中位数为 K 的子数组
C++前缀和算法的应用:统计中位数为 K 的子数组
|
2月前
|
数据采集
IQR法(四分位距法)
IQR法(四分位距法)
|
4月前
|
C++
643. 子数组最大平均数 I(C++)
643. 子数组最大平均数 I(C++)
|
6月前
|
测试技术
643.子数组最大平均数
643.子数组最大平均数
27 0
|
6月前
leetcode-6118:最小差值平方和
leetcode-6118:最小差值平方和
34 0
|
Java
寻找两个有序数组的中位数
寻找两个有序数组的中位数
103 0
|
数据格式
SPSS计算偏度、峰度、平均值、极值、中位数、标准差
本文介绍基于SPSS软件的经典统计学分析与偏度、峰度等常用统计学指标的计算方法~
4104 1
SPSS计算偏度、峰度、平均值、极值、中位数、标准差
|
数据挖掘 BI 定位技术
为什么中位数(大多数时候)比平均值好
为什么中位数(大多数时候)比平均值好
250 1
为什么中位数(大多数时候)比平均值好
|
数据处理
集中趋势中均值、中位数、众数以及偏态分布、偏度和峰度计算相关
集中趋势中均值、中位数、众数以及偏态分布、偏度和峰度计算相关
505 0
集中趋势中均值、中位数、众数以及偏态分布、偏度和峰度计算相关