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不易,诸君共勉!
大道五十,天衍四九,人遁其一!