P1042 字符统计

P1042 字符统计

转跳点:🐏

1042 字符统计 (20分)

输入格式:

输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出格式:

在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

输入样例:

This is a simple TEST.  There ARE numbers and other symbols 1&2&3...........

输出样例:

e 7

这道题又是个计数题了一看出现次数最多,ASCII字符,加了空格,开个128的数组一个个计数,最后再跑一边保存下最大值的索引,%c输出索引,%d输出索引上的值完事。

上面那段就是我自以为是加眼瞎的后果。唉,枯了枯了,人家只要求输出英文字母数量,而且输入会有大小写,但只输出小写字符,(自戳双目)。要过滤非英文字符有两种方法。

第一种就直接 if ((x >= ‘a’) && (x <= ‘z’) || (x >= ‘A’) && (x <= ‘Z’) )

第二种则是用C语言里的ctype头文件里的 isalpha 函数筛出(个人觉得其实本质上没多大区别(>人<;))

这个是ctype里isxxx系列函数的实现方式

#define __ISCTYPE(c, mask)  (MB_CUR_MAX == 1 ? (_pctype[c] & mask) : _isctype(c, mask))//这句是核心
__CRT_INLINE int __cdecl __MINGW_NOTHROW isalnum(int c) {return __ISCTYPE(c, (_ALPHA|_DIGIT));}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isalpha(int c) {return __ISCTYPE(c, _ALPHA);}//这句是识别字母的
__CRT_INLINE int __cdecl __MINGW_NOTHROW iscntrl(int c) {return __ISCTYPE(c, _CONTROL);}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isdigit(int c) {return __ISCTYPE(c, _DIGIT);}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isgraph(int c) {return __ISCTYPE(c, (_PUNCT|_ALPHA|_DIGIT));}
__CRT_INLINE int __cdecl __MINGW_NOTHROW islower(int c) {return __ISCTYPE(c, _LOWER);}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isprint(int c) {return __ISCTYPE(c, (_BLANK|_PUNCT|_ALPHA|_DIGIT));}
__CRT_INLINE int __cdecl __MINGW_NOTHROW ispunct(int c) {return __ISCTYPE(c, _PUNCT);}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isspace(int c) {return __ISCTYPE(c, _SPACE);}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isupper(int c) {return __ISCTYPE(c, _UPPER);}
__CRT_INLINE int __cdecl __MINGW_NOTHROW isxdigit(int c) {return __ISCTYPE(c, _HEX);}

 

 

这道题我莫没有用128做数组大小,因为只统计字母,而字母只有26个。所以……嗯!本着节约(kou‘men)的理念开了26,并且对输入进行了特殊处理,刚好可以存下。所谓的特殊处理就是 a从96开始所有输入的字母都转成小写后减去96,刚好大小就是0~25,输出的时候记得加回96

AC代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

//统计英文字母个数的数组
int count[26];

int main(void)
{
    char ch;
    int max = 0; //存储最大值索引

    while ((ch = getchar()) != '\n')
    {
        if (isalpha(ch))
        { //要求输出英文字母
            count[(int)tolower(ch) - 96]++;
        }
    }

    for (int i = 0; i < 26; i++)
    {
        if (count[i] > count[max])
        {
            max = i;
        }
    }

    printf("%c %d\n", (char)(max + 96), count[max]);

    return 0;
}

 

PTA不易,诸君共勉!

posted @ 2020-02-10 20:17  秦_殇  阅读(262)  评论(0编辑  收藏  举报