问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
2 3
5 3
1 1
4 1
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
#include
#include
struct temNum {
int value;
int freq;
};
int comp(const void *a , const void *b) {
if((*(temNum*)b).freq > (*(temNum*)a).freq)
return 1;
else if((*(temNum*)b).freq == (*(temNum*)a).freq && (*(temNum*)b).value < (*(temNum*)a).value)
return 1;
return 0;
}
int num[1005] = {0};
int main() {
int n;
int temp;
int freNum = 0;
scanf("%d",&n);
temNum testNum[n];
for(int i = 1; i <= n; i++) {
scanf("%d",&temp);
num[temp]++;
}
for(int i = 0; i <= 1000; i++) {
if(num[i] != 0) {
freNum++;
testNum[freNum].value = i;
testNum[freNum].freq = num[i];
}
}
qsort(&testNum[1],freNum,sizeof(temNum),comp);
for(int i = 1; i <= freNum; i++) {
printf("%d %d\n",testNum[i].value,testNum[i].freq);
}
//system("pause");
return 0;
}
非负整数包括0!!!
但只得了40分,这使我百思不得其解,仔细检查,发现qsort必须如果返回0,是没有任何效果的,于是进行修改:
#include
#include
struct temNum {
int value;
int freq;
};
int comp(const void *a , const void *b) {
if((*(temNum*)b).freq > (*(temNum*)a).freq)
return 1;
else if((*(temNum*)b).freq == (*(temNum*)a).freq && (*(temNum*)b).value < (*(temNum*)a).value)
return 1;
return -1;
}
temNum testNum[1005];
int main() {
int n;
int temp;
int freNum = 0;
for(int i = 0; i <= 1004; i++) {
testNum[i].value = i;
testNum[i].freq = 0;
}
scanf("%d",&n);
for(int i = 1; i <= n; i++) {
scanf("%d",&temp);
testNum[temp].freq++;
}
qsort(testNum,1004,sizeof(temNum),comp);
for(int i = 0; i <= 1004 && testNum[i].freq != 0; i++) {
printf("%d %d\n",testNum[i].value,testNum[i].freq);
}
//system("pause");
return 0;
}