求N个整数的平均数、众数和中位数
题目描述
求N个整数的平均数,众数和中位数。
输入
第一行为整数N(5 <= N <= 10000 ) 第二行为空格隔开的N个数Ai(0 <= Ai <= 100 )
输出
输出空格隔开的平均数 众数 中位数(平均数保留两位小数,中位数保留一位小数)。
样例输入
6
5 2 2 3 4 6
样例输出
3.67 2 3.5
提示:
出现次数最多的数有且只有一个。
思路:
指针和函数的灵活运用,将数组先排序,后计算。由于求众数比较复杂,所以可以封装成函数,比较方便。
AC代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10005];
/*交换两个整数的值*/
void swap(int *p, int *q)
{
int buf;
buf = *p;
*p = *q;
*q = buf;
return;
}
/*查找一个有序数组中的众数*/
int find_mode_number(int *arr,int len)
{
int many = 1,less = 1;
int value = 0;
for(int i = 0; i < len; i++)
{
for(int j = i; j < len; j++)
{
if(arr[j] == arr[j+1])
{
less++;
}
else
{
if(many < less)
{
swap(&many,&less);
value = arr[j];
}
less = 1;
break;
}
}
}
return value;
}
int main()
{
int n;
scanf("%d",&n);
//输入数组元素
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n); //将数组排序
int sum=0; //先求和后求平均数
for(int i=0; i<n; i++)
{
sum+=a[i]; //数组求和
}
//平均数
double avg=sum*1.0/n*1.0;
//中位数
double mid_num;
if(n%2==0)//当数字个数为偶数时
{
mid_num=(a[(n-1)/2]+a[n/2])*1.0/2.0;
}
else //当数字个数为奇数时
{
mid_num=a[n/2];
}
//众数
int count=find_mode_number(a,sizeof(a)/sizeof(int));//调用求众数函数
//打印
printf("%.2lf %d %.1lf\n",avg,count,mid_num);
return 0;
}