问题描述 给定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
思路
1首先将数字排序,统计数字种类
2创建结构体,将数字种类以及数字个数存入
3将数字个数按题目要求排序(结构体整体)
#include<stdio.h>
struct stu//创建输出模板
{
int num;
int nm;
};
int main()
{
int n,ma=1,ha=0,si=1;
scanf("%d",&n);
int a[1000],i,j,t;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)//数字排序方便统计种类
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=1;i<n;i++)
{
if(a[i]!=a[i-1])si++;
}
struct stu b[si],app;
for(i=1;i<n;i++)//存入结构体
{
if(a[i]==a[i-1])ma++;
else
{
b[ha].num=a[i-1];
b[ha].nm=ma;
ha++;
ma=1;
}
}
b[ha].num=a[n-1];
b[ha].nm=ma;
for(i=0;i<ha;i++)//结构体内排序
{
for(j=0;j<ha-i;j++)
{
if(b[j].nm>b[j+1].nm)
{
app=b[j];
b[j]=b[j+1];
b[j+1]=app;
}
else if(b[j].nm==b[j+1].nm)
{
if(b[j].num<b[j+1].num)
{
app=b[j];
b[j]=b[j+1];
b[j+1]=app;
}
}
}
}
for(i=ha;i>=0;i--)
{
printf("%d %d\n",b[i].num,b[i].nm);
}
}