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].n
for(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;
}