题目
众数是指一组数据中出现次数多的数
众数可以是多个
中位数是指把一组数据从小到大排列,最中间的那个数,
如果这组数据的个数是奇数,那最中间那个就是中位数
如果这组数据的个数为偶数,那就把中间的两个数之和除以 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。函数内部的代码:
- 统计数字出现频率:
- 创建一个整数数组
arr
来存储每个数字出现的次数。- 使用
strtok
函数将输入字符串line
分割成以空格分隔的数字。- 遍历每个数字:
- 使用
sscanf
函数将字符串转换为整数。- 将对应数字在
arr
数组中的计数加 1。
- 找出出现频率最高的数字并存入新数组:
- 找到
arr
数组中的最大值max
,代表出现频率最高的数字。- 创建一个新的数组
newarr
来存储出现频率最高的数字。- 遍历
arr
数组,将出现频率为max
的数字存入newarr
数组。
- 计算中位数:
- 如果
newarr
数组中的元素个数为偶数,则中位数为中间两个元素的平均值。- 如果
newarr
数组中的元素个数为奇数,则中位数为中间元素的值。- 计算出中位数并存入
res
变量中。
- 打印中位数:
- 使用
printf
函数打印res
变量的值,即中位数。主函数main:
- 读取输入字符串:
- 声明一个字符串
line
来存储输入的数字。- 使用
fgets
函数从标准输入中读取一行字符串并存入line
变量中。- 使用
strcspn
函数去除line
字符串末尾的换行符。
- 调用函数并返回:
- 调用
solveMethod
函数来处理输入字符串line
并计算中位数。- 返回 0 表示程序正常退出。
总结一下,这个程序的作用是:
- 读取一行以空格分隔的整数。
- 统计每个数字出现的频率。
- 找出出现频率最高的数字。
- 计算这些数字的中位数。
- 打印中位数。