| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 430 人关注过本帖
标题:一个简单的程序题,怎么解决?
只看楼主 加入收藏
Garkey
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2019-12-9
结帖率:0
  已结贴   问题点数:20  回复次数:6   
一个简单的程序题,怎么解决?
描述
西其格尔大陆有 26 个鼎鼎大名的作家,他们的著作很多。他们的名字首字母正好是(A~Z)这 26 个字母。
现在给出 n 本书的编号及其作者,请你帮忙找一找,在这 n 本书里,著作最多的是哪三个作家(保证输入数据中有3个不同作家)。

输入
第一行输入一个整数 n 。表示接下来有 n 行数据(5 <= n <= 100,000)。
接下来的每一行,先输入一个整数 num 表示数的编号,再输入一个名字(其首字母一定是A~Z中的一个)。

输出
输出一共有3行,表示著作最多的前3个作家,每个占一行(如果著作一样多,字母序号在前的作家排名靠前)。

输入样例 1
6
72 Anna
872 Bela
81 Bela
213 Anna
847 Zwc
984 Luty
输出样例 1
Anna
Bela
Luty
搜索更多相关主题的帖子: 输入 表示 输出 字母 一行 
2019-12-09 20:09
兔先生
Rank: 2
等 级:论坛游民
帖 子:33
专家分:20
注 册:2018-11-9
  得分:5 
创建有26个空间的数组,下标对应1-26个作家,值代表著作数。
输入完再排个序
2019-12-09 21:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:349
帖 子:7150
专家分:41639
注 册:2011-1-18
  得分:5 
名字中可能含有空白字符吗?
输入项会有重复吗?比如两个 72 Anna。

如果没重复的话,
unsigned buf[26] = { 0 };
循环 scanf( "%*s %c%[^\n]", &c ); ++buf[c–'A'];
最后排序(部分排序就行了,比如 大根堆)
2019-12-09 21:52
纯蓝之刃
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:18
帖 子:338
专家分:1964
注 册:2019-7-29
  得分:5 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Menu
{
    int num;
    char name[50];
    struct Menu *next;
}Book,*List;

struct name
{
    int num;
    char name[50];
};

List createlist(int n);
void outputlist(List L);

int main()
{
    int n;
    List h;

    printf("请输入数据个数:");
    scanf("%d",&n);
    h=createlist(n);
    outputlist(h);
    return 0;
}

List createlist(int n)
{
    List L=(Book*)malloc(sizeof(Book));
    L->next=NULL;
    Book *r=L;
    int i;

    for(i=0;i<n;i++)
    {
        Book* p=(Book*)malloc(sizeof(Book));
        scanf("%d%s",&p->num,&p->name[0]);
        p->next=NULL;
        r->next=p;
        r=p;
    }
    return L;
}

void outputlist(List L)
{
    struct name t,num[26]={0};
    Book *p;

    p=L->next;
    while(p)
    {
        num[p->name[0]-65].num++;
        strcpy(num[p->name[0]-65].name,p->name);
        //printf("num=%d,name=%s\n",p->num,p->name);
        p=p->next;
    }

    for(int i=0;i<25;i++)
    {
        for(int j=0;j<25-i;j++)
        {
            if(num[j].num<num[j+1].num)//比较大小
            {
                t=num[j];
                num[j]=num[j+1];
                num[j+1]=t;
            }
        }
    }

    for(int i=0;i<3;i++)
    {
        printf("%s\n",num[i].name);
    }
}
2019-12-09 21:53
Garkey
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2019-12-9
  得分:0 
回复 4楼 纯蓝之刃
我用visual studio 2017无法测试,总是报错,请问您用的是什么编译软件?
2019-12-10 08:32
纯蓝之刃
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:18
帖 子:338
专家分:1964
注 册:2019-7-29
  得分:0 
你报的什么错?这里没有用到一些偏的东西,按理说应该都能编译,我用的是codeblocks,也就是GUN编译器。
2019-12-10 16:07
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:55
专家分:32
注 册:2018-4-20
  得分:5 
visual studio 2017 環境中 scanf 要關掉警告 (猜測你的錯誤

關掉警告
#define _CRT_SECURE_NO_WARNINGS

- - - - - -我使用跟你的環境可以編譯

[此贴子已经被作者于2019-12-10 18:20编辑过]

2019-12-10 18:17
快速回复:一个简单的程序题,怎么解决?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.082317 second(s), 9 queries.
Copyright©2004-2020, BCCN.NET, All Rights Reserved