根据教师的花名册,找到出勤最多的人。
输入格式:
出勤记录单行给出,数据直接使用空格分割。
输出格式:
单行输出(若有多人,人名直接使用空格分割,结尾处没有空格)。
输入样例:
在这里给出一组输入。例如:
zs ls ww ml zs ls ml zs ww
输出样例:
在这里给出相应的输出。例如:
zs
#include<stdio.h>
int main()
{
int i,in,p,pn,num=0,Word=0,max=0;
char a[1000],ch;
gets(a);
int b[1000]={0};
int c[500]={1};
for(i=0;(ch=a[i])!='\0';i++)
{
if(ch!=' ')
{
if(Word==0) //保证是遇到本单词的第一个首字母的时候执行操作
{
Word=1;
b[num]=i; //此时的i就是这个单词的起始位置,我们做记录
num++; //准备下次再用
}
}
else if(ch==' ')
{
Word=0;
}
}
Word=0;
//自此我们找到了所有单词的首字母位置,现在开始分割各个单词
for(i=0;i<num;i++) //第一个单词开始
{
if(b[i]==-1) //避免重复运算
{
continue;
}else{
for(p=i+1;p<num;p++) //p是下个单词,b[p]是下个单词的首字母位置
{
if(a[b[i]]==a[b[p]])
{
in =b[i]+1;
pn =b[p]+1;
while(a[in]!=' ')
{
if(a[in]==a[pn])
{
Word=1;//再次使用Word作为标志位
}else{
Word=0;
break;
}
in++;
pn++;
}
if(Word==1)
{
if(a[pn]==' ')
{
c[i]++;
b[p]=-1; //重复标志位
}
}
}
}
}
}
for(i=0;i<num;i++) //找出重复数最大的那一个
{
if(c[i]>max)
{
max=c[i];
}
}
for(i=0;i<num;i++) //输出重复数最大的那一个的内容,即题目所求
{
if(c[i]==max)
{
p=0;
while(a[b[i]+p]!=' ')
{
printf("%c",a[b[i]+p]);
p++;
}
break; //一旦找到并输出以后,结束循环,减少运行次数
}
}
return 0;
}
看到优快云上关于这道题的解法都是Java写的,奈何目前不会Java,用C语言写了一遍,用的库函数不多,代码较长,欢迎以后搜到这个博客的科大同学一起交流。