山东理工——1525
Problem Description
输入英文句子,输出该句子中除了空格外出现次数最多的字符及其出现的次数。
Input
输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。
Output
逐行输出每个句子中出现次数最多的字符及其出现的次数(如果有多个字符的次数相同,只输出ASCII码最小的字符)。
Sample Input
I am a student
a good programming problem
ABCD abcd ABCD abcd
Sample Output
a 2
o 4
A 2
**分析:**读入的字符串有空格,不能用scanf,这里应用gets()获取字符串
代码如下:
#include<stdio.h>
int main(void)
{
char a[100], b[100] = {'\0'};
char p[100] = {'\0'};
int t[100] = {0};
int n, i, j,e,j_;
int max, min, max_[10];
while (gets(b) != NULL)//多次输入,读入字符串b
{
for (i = 0, j = 0; b[i]; i++)//将b里边的空格删除并保存在字符串a内
{
if (b[i] != ' ')
a[j++] = b[i];
}
a[j] = '\0'; //给a设置结尾
j = 0; p[0] = '\0';
for (i = 0; a[i]; i++)//遍历字符串a,并对每一个元素分析
{
e = 0;
for (j_ = 0; p[j_] != '\0'; j_++)//遍历字符串p,a中的元素与每一个p中的元素比较
{
if (a[i] == p[j_])
e=e+1;
}
if (e == 0)//如果a的这个元素与p中的任意元素不相同
{
p[j] = a[i];//让p保存这个字符
p[j + 1] = '\0';
t[j]=t[j]+1;//与p此位置对应的数量增加
j=j+1;
}
else//如果a的这个元素与p中的元素有相同的
{
for (j_ = 0; p[j_] != '\0'; j_++)//遍历p找到那个位置与a的这个元素相同
{
if (a[i] == p[j_])
{
t[j_] = t[j_] + 1;//对应位置的数量增加
break;
}
}
}
}
max = 0;
for (i = 0; t[i] != 0; i++)//找到最大的数量是多少
{
if (t[i] > t[max])//t[max]为最大数量
max = i;
}
j=0;
for (i = 0; t[i] != 0; i++)
{
if (t[i] == t[max])//找到有哪些位置字符的数量与最大数量相同
{
max_[j] = i;//保存在max_中
j++;
}
}
min = 0;
for (i = 0; i < j; i++)//找到最大数量的字符里边的ASCII码最小的
{
if (p[max_[i]]-'0' < p[max_[min]]-'0')//
min = i;//找到数量最大,并且ASII码最小的位置为max_[min]
}
printf("%c %d\n",p[max_[min]],t[max_[min]]);
for(i=0;i<=100;i++)//将p与t赋值为0
{
p[i]='\0';
t[i]=0;
}
}
return 0;
}