标题
数字统计排序
类别
综合
时间限制
1S
内存限制
256Kb
问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出,次数相同时先输出值较小的数。
输入说明
输入的第一行包含一个整数n,表示给定数字的个数。 1 ≤ n ≤ 1000。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。给出的数都是不超过1000的非负整数。
输出说明
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
输入样例
12
5 2 3 3 1 3 4 2 5 2 3 5
输出样例
3 4
2 3
5 3
1 1
4 1
#include <stdio.h>
int main() {
//思路:先把不重复元素记录下来,再对应计数
int n;
scanf("%d",&n);
int i,j;
int a[1000];
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int b[1000],r,flag;//b是把a中不重复元素记下来
b[0]=a[0];
j=1;//j用来记录b中有多少元素
r=1;//r是一个计数器
do
{
flag=0;
for(i=0;i<r;i++)
{
if(a[i]==a[r])
{
flag=1;
}
}//循环结束后,i=r了
if(flag==0)
{
b[j]=a[i];
j++;//j即b中元素数。因为第一个元素是b[0]!
}
r++;
}while(r<n);
//开始计数
int c[1000],m;//c是记录某个数出现次数的数组,m是计数器
for(i=0;i<j;i++)
{
c[i]=0;
for(m=0;m<n;m++)//遍历数组a
{
if(a[m]==b[i])
{
c[i]++;
}
}
}
//把两个数组捆绑排序
struct gro{
int num;
int time;
}M[j],temp;
for(i=0;i<j;i++)
{
M[i].num=b[i];
M[i].time=c[i];
}
for(i=0;i<j-1;i++)//起泡排序
{
for(m=0;m<j-i-1;m++)
{
if(M[m].time<M[m+1].time)
{
temp=M[m];
M[m]=M[m+1];
M[m+1]=temp;
}
else if(M[m].time==M[m+1].time)
{
if(M[m].num>M[m+1].num)
{
temp=M[m];
M[m]=M[m+1];
M[m+1]=temp;
}
}
}
}
for(i=0;i<j;i++)
{
printf("%d %d\n",M[i].num,M[i].time);
}
return 0;
}