现在需要统计一个组的人的生肖相同的个数,生肖有以下十二个:Rat(鼠)、Ox(牛)、Tiger(虎)、Rabbit(兔子)、Dragon(龙)、Snake(蛇)、Horse(马)、Goat(羊)、Monkey(猴子)、Rooster(鸡)、Dog(狗)、Pig(猪)。要求生肖相同的人的个数最多的排在前面,如果生肖相同的人的个数也相同则按照字典序列排序(也就是生肖字母排序)。详细请看输入、输出样例。
输入格式:首先输入一个正整数n,然后再输入n组数据,输入的每组数据包含了姓名和生肖两个信息。
输入样例:
5
Tom Rat
Bob Ox
John Goat
James Ox
David Rat
输出样例:
Ox2
Rat 2
Goat 1
#include <stdio.h>
#include <string.h>
// 定义生肖数组
const char* zodiacs[] = {"Rat", "Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig"};
const int NUM_ZODIACS = 12;
struct ZodiacCount {
const char* zodiac;
int count;
};
// 函数:比较两个生肖的顺序
int compareZodiac(const void* a, const void* b) {
const struct ZodiacCount* zc1 = (const struct ZodiacCount*)a;
const struct ZodiacCount* zc2 = (const struct ZodiacCount*)b;
if (zc1->count != zc2->count) {
return zc2->count - zc1->count; // 按照个数从大到小排序
} else {
return strcmp(zc1->zodiac, zc2->zodiac); // 如果个数相同,则按照字典序排序
}
}
int main() {
int n;
scanf("%d", &n);
// 创建一个结构体数组来保存生肖和个数
struct ZodiacCount zodiacCounts[NUM_ZODIACS];
// 初始化结构体数组
for (int i = 0; i < NUM_ZODIACS; i++) {
zodiacCounts[i].zodiac = zodiacs[i];
zodiacCounts[i].count = 0;
}
// 统计生肖个数
char name[100], zodiac[100];
for (int i = 0; i < n; i++) {
scanf("%s %s", name, zodiac);
for (int j = 0; j < NUM_ZODIACS; j++) {
if (strcmp(zodiac, zodiacs[j]) == 0) {
zodiacCounts[j].count++;
break;
}
}
}
// 排序
qsort(zodiacCounts, NUM_ZODIACS, sizeof(struct ZodiacCount), compareZodiac);
// 输出结果
for (int i = 0; i < NUM_ZODIACS; i++) {
if (zodiacCounts[i].count > 0) {
printf("%s %d\n", zodiacCounts[i].zodiac, zodiacCounts[i].count);
}
}
return 0;
}