一、问题描述
【问题描述】
一组数据中出现最多的数,称为众数。比如
1 2 3 3
众数为3。一组数据中也可能有多个众数,以最先出现的作为众数。比如
2 2 3 3
众数为2。
问题是一组按升序排好的数据,指出它的众数。
【输入形式】
有多组测试数据(不超过100组测试数据)。
每组测试数据占两行,第一行是正整数N:表示这组测试数据中数据项数。
第二行是N个用空格隔开的正整数,表示这组测试数据的数据元素。每个数据元素都不大于10000。
N=0,表示输入结束,并且不需要处理。
40%的测试数据N 1 ≤N≤ 10;
30%的测试数据N 10 < N≤ 100;
20%的测试数据N 100 < N≤ 1000;
10%的测试数据N 1000 < N≤ 10000;
【输出形式】
对于每组测试数据,输出一行包含一个正整数:对应的众数。
二、问题分析及边界条件
要处理的问题:
1.N≠0 时输入多组数据
2.在每组有序数据中找出现最多的数字
边界条件:
1.N=0 时结束输入
2.数字出现次数相等,输出早出现的数字
三、算法设计
通过上述分析,将采用下面的方法解决相关问题:
1.使用 while 循环输入N并确定是否为0
2.使用动态数组保存输入的数字
3.使用整形分别存储当前出现最多的个数、当前数字的个数、当前个数最多的数字
4.使用一个 for 循环从前往后遍历数组(已经拍好序), 如果后项=前项,当前次数+1;反之,比较当前个数与最多个数,若当前个数更大,替换最多个数,同时替换最多为当前数字(注意:向后循环时当前个数要清零才可去记录下一个数)
5.输出最多的数字
四、详细设计(从算法到程序)
1.建立整形 N
2.循环输入 N 并判断是否结束
while(cin>>N&&N!=0) {}
3.建立整形动态数组,存储 N 个数字
int *a=new int[N];
4. 整形 num 记录当前数字的个数,max记录当前最大的个数(比较大小时常用一个额外的min/max来存储当前最小/最大,之后如果有更小/更大就替换),x记录当前的众数
5.for 循环找众数
for(int i=0;i<=N;i++){
if(a[i-1]==a[i]){
num++;
}
else{
if(max<num){
max=num;
x=a[i-1];
}
num=0;
}
cout<<x<<endl;
6.代码展示
#include <iostream>
using namespace std;
int main()
{
int N;
while(cin>>N&&N!=0){
int *a=new int[N];
for(int i=0;i<N;i++){
cin>>a[i];
}
int num=0,max=0,x=0;
for(int i=0;i<=N;i++){
if(a[i-1]==a[i]){
num++;
}
else{
if(max<num){
max=num;
x=a[i-1];
}
num=0;
}
}
cout<<x<<endl;
}
return 0;
}
五、样例设计与测试
1.正常测试
2.存在多个众数
六、分析与总结
1.当采用一个整形记录各个数的个数时,开始下一个前清零
2.求有序数组众数时,可以从前往后遍历,设置一个变量来记录;无序数组可排序变为有序,或者采用数组记录各个数的个数(较麻烦,不能确定数字有多少种)