- 描述
-
假定图书馆新进了m(10 ≤ m ≤ 999)本图书,它们都是由n(2 ≤ n ≤ 26)个作者独立或相互合作编著的。假设m本图书编号为整数(1到999),作者的姓名为字母('A'到'Z'),请根据图书作者列表找出参与编著图书最多的作者和他的图书列表。
- 输入
- 第一行为所进图书数量m,其余m行,每行是一本图书的信息,其中第一个整数为图书编号,接着一个空格之后是一个由大写英文字母组成的没有重复字符的字符串,每个字母代表一个作者。输入数据保证仅有一个作者出书最多。
- 输出
- 输出有多行:
第一行为出书最多的作者字母;
第二行为作者出书的数量;
其余各行为作者参与编著的图书编号(按输入顺序输出)。 - 样例输入
-
11
307 F
895 H
410 GPKCV
567 SPIM
822 YSHDLPM
834 BXPRD
872 LJU
791 BPJWIA
580 AGMVY
619 NAFL
233 PDJWXK - 样例输出
-
P
6
410
567
822
834
791
233 - 来源:
- 北京大学 计算概论 06 心理及信管 期末考试
- 思路:这题呢,蛮简单,可以运用结构体,统计每本书中作者最多的是哪位,再循环判断出了哪些书,输出即可。
- 代码如下:
#include <stdio.h>
#include <string.h>
struct book
{
int num;
char writer[];
};
int main()
{
int m,i,j;
int xiabiao;//出书最多作者下标
int large;//出书最多作者出的书
char large2;//出书最多作者名字
int flag[];//统计每个作者名字出现的个数
struct book a[];//结构体,存储编号,作者姓名
scanf("%d",&m);
for(i=;i<;i++)//初始化
{
flag[i]=;
}
for(i=;i<m;i++)//输入编号、作者
{
scanf("%d%s",&a[i].num,&a[i].writer);
}
for(i=;i<m;i++)//统计每个作家名字出现次数
{
for(j=;j<strlen(a[i].writer);j++)
{
flag[a[i].writer[j]-]++;
}
}
large=flag[];
for(i=;i<;i++)//找出出书最多的作家
{
if(flag[i]>large)//如果发现一个比目前还要大的,更新
{
xiabiao=i;
large=flag[i];
}
}
large2=xiabiao+;
printf("%c\n%d\n",large2,large);//输出出书最多作家名字、著作篇数
for(i=;i<m;i++)
{
for(j=;j<strlen(a[i].writer);j++)
{
if(a[i].writer[j]==large2)
{
printf("%d\n",a[i].num);
break;
}
}
}
return ;
}