众数和中位数

这篇文章描述了一个C/C++程序,用于统计输入整型数组中元素的众数,并根据众数构成新的数组,最后计算新数组的中位数。作者给出了详细的代码实现和示例输入输出情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html

题目

众数是指一组数据中出现次数多的数
众数可以是多个
中位数是指把一组数据从小到大排列,最中间的那个数,
如果这组数据的个数是奇数,那最中间那个就是中位数
如果这组数据的个数为偶数,那就把中间的两个数之和除以 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。
  2. 找出出现频率最高的数字并存入新数组:

    • 找到 arr 数组中的最大值 max,代表出现频率最高的数字。
    • 创建一个新的数组 newarr 来存储出现频率最高的数字。
    • 遍历 arr 数组,将出现频率为 max 的数字存入 newarr 数组。
  3. 计算中位数:

    • 如果 newarr 数组中的元素个数为偶数,则中位数为中间两个元素的平均值。
    • 如果 newarr 数组中的元素个数为奇数,则中位数为中间元素的值。
    • 计算出中位数并存入 res 变量中。
  4. 打印中位数:

    • 使用 printf 函数打印 res 变量的值,即中位数。

主函数main:

  • 读取输入字符串:

    • 声明一个字符串 line 来存储输入的数字。
    • 使用 fgets 函数从标准输入中读取一行字符串并存入 line 变量中。
    • 使用 strcspn 函数去除 line 字符串末尾的换行符。
  • 调用函数并返回:

    • 调用 solveMethod 函数来处理输入字符串 line 并计算中位数。
    • 返回 0 表示程序正常退出。

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

  1. 读取一行以空格分隔的整数。
  2. 统计每个数字出现的频率。
  3. 找出出现频率最高的数字。
  4. 计算这些数字的中位数。
  5. 打印中位数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~柠月如风~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值