题目描述
输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。
输入描述:
测试数据有多组,每组输入20个1-10之间的数。
输出描述:
对于每组输入,请输出1-10中的众数。
示例1
输入
5 1 5 10 3 5 3 4 8 6 8 3 6 5 10 7 10 2 6 2
输出
5
代码实现:
#include<iostream>
using namespace std;
int main(){
int e,arr[20],count[20],record[20],i=0,j=0;
// 初始化 e为输入元素,arr保存20个输入,count保存每个元素的计数值,record保存每个元素的值,i用于记录当前输入元素个数,20个后清零,j记录元素种类的个数,与i同时清零
for(int k=0;k<20;k++){
arr[k]=0;
count[k]=0;
record[k]=0;
}// 初始化数组
while(cin>>e){
if(e>=1 && e<=10){//当输入元素满足条件时,计入数组
arr[i]=e;
if(j==0){//第一个计数元素,直接保存
record[j]=e;
count[j]++;
j++;
}else{
int k=0,flag=false;;
for(;k<j;k++){//对比计数数组中的元素,若有相同,则计数值+1;
if(record[k]==e){
count[k]+=1;
flag=true;
break;
}
}
if(!flag){//若计数数组中未有该元素,则新增保存
record[j]=e;
count[j]++;
j++;
}
}
i++;
}
if(i==20){
// 满20个就输出众数
int max=count[0],num=record[0];// max为最多的次数,num保存对应众数
for(int k=0;k<j;k++){
// cout<<record[k]<<":"<<count[k]<<endl;
if(count[k]==max && record[k]<num)// 如果出现次数相同,则保存权值小的
num=record[k];
else if(count[k]>max){//如果次数大于当前记录,则更新
max=count[k];
num=record[k];
}
}
cout<<num;//输出众数
// clear
i=0;j=0;
for(int k=0;k<20;k++){
arr[k]=0;
count[k]=0;
record[k]=0;
}
}
}
return 0;
}
/*
解题思路:
每输入一个数,就与统计数组中的数字一一对比,如果数组中没有,就新增,如果有计数值就+1,最后对统计数组进行排序
*/