There are two solutions for this problem.
First:
#include<stdio.h>
//算法存在冗余计算量
//数值相同的两个或多个的出现次数都计算了,只不过是逐次-1
//因此没有影响最后计算结果
//用链表或者统计标记的方法解都很好
//将数组中出现过的数排成队列或标记
//节省计算量
int main()
{
int n;
int m[10000];
scanf("%d",&n);
int i,j;
int min=32000;//int -32768~32767记录出现次数最多的最小数
int maxnum=0;//记录出现的最大次数
int book[10000]={0};//记录每个元素出现的次数
for(i=0;i<n;i++)
book[i]=1;
for(i=0;i<n;i++)
scanf("%d",&m[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(m[i]==m[j])
book[i]++;
}
for(i=0;i<n;i++)
{
if(book[i]>maxnum)
{
min=m[i];
maxnum=book[i];
}
else if(book[i]==maxnum)
{
if(m[i]<min)
min=m[i];
}
}
printf("%d",min);
return 0;
}
Second:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int book[10001]={0};
int data[10001]={0};
int i,j,min,time;
int count=0;
int a;
for(i=0;i<n;i++)
{
scanf("%d",&a);
if(book[a]==0)
{
data[count]=a;
count++;
book[a]++;
}
else
book[a]++;
}
min=data[0];
time=book[min];
for(j=1;j<count;j++)
{
if(book[data[j]]==time)
{
min=(data[j]<min)?data[j]:min;
}
else if(book[data[j]]>time)
{
min=data[j];
time=book[data[j]];
}
else
continue;
}
printf("%d",min);
return 0;
}
Good Luck to myself !