当前位置: 代码迷 >> 综合 >> 字符统计2 sdut 1525
  详细解决方案

字符统计2 sdut 1525

热度:80   发布时间:2023-11-27 04:34:46.0

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

输入英文句子,输出该句子中除了空格外出现次数最多的字符及其出现的次数。
Input

输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。
Output

逐行输出每个句子中出现次数最多的字符及其出现的次数(如果有多个字符的次数相同,只输出ASCII码最小的字符)。
Example Input

I am a student
a good programming problem
ABCD abcd ABCD abcd
Example Output

a 2
o 4
A 2

第一种方法(自己想的,比较蠢,可作参考)

#include <stdio.h> #include <stdlib.h> #include <string.h> struct {int n;char s; }zz[]= {
    {0,'A'},{0,'B'},{0,'C'},{0,'D'},{0,'E'},{0,'F'},{0,'G'},{0,'H'},{0,'I'},{0,'J'},{0,'K'},{0,'L'},{0,'M'},{0,'N'},{0,'O'},{0,'P'},{0,'Q'},{0,'R'},{0,'S'},{0,'T'},{0,'X'},{0,'Y'},{0,'Z'},{0,'U'},{0,'V'},{0,'W'},{0,'a'},{0,'b'},{0,'c'},{0,'d'},{0,'e'},{0,'f'},{0,'g'},{0,'h'},{0,'i'},{0,'j'},{0,'k'},{0,'l'},{0,'m'},{0,'n'},{0,'o'},{0,'p'},{0,'q'},{0,'r'},{0,'s'},{0,'t'},{0,'u'},{0,'v'},{0,'w'},{0,'x'},{0,'y'},{0,'z'} };int main() {int i,q,j,w,e;char a[100];while(gets(a)){e=0;//e赋初值,防止忽略zz[0].nfor(i=0;i<52;i++)//需要重新赋初值zz[i].n=0;q=strlen(a);for(i=0; i<52; i++)for(j=0; j<q; j++)if(zz[i].s==a[j])//不能为i,应为j;zz[i].n++;w=zz[0].n;for(i=1; i<52; i++)if(w<zz[i].n){w=zz[i].n;e=i;}printf("%c %d\n",zz[e].s,w);}return 0; }

第二种方法(我认为是一种很棒的做法,留作参考)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{int i,w,e,a[200];char q[100];while(gets(q)){w=-1;//w定义为负数后,可以保证在啊a[0]变换是的值for(i=0;i<200;i++)a[i]=0;for(i=0;i<strlen(q);i++)//统计字符{if(q[i]!=' ')a[q[i]]++;//字符统计}for(i=65;i<123;i++){if(w<a[i]){w=a[i];e=i;}}printf("%c %d\n",e,w);//强制转化字符}
return 0;}