问题描述
- 新手OJ一题,自认为正确, 但是wrong,恳求大神指出
-
Description
钟Sir是一个迷信的(superstitious)家伙。他相信每一个字符串(string)里都有一个幸运字符。我们可以通过以下方法找到这个字符。例如,在字符串abbccc中,c 出现的次数最多,所以这个幸运字符就是 c 啦!(>_<) (钟Sir的想法好简单啊…)
Input
第一行是测试数据的组数n,接下来的每组测试数据占一行,每行数据不超过1000个字符且非空。
字符串里只含小写字母。
Output
每组数据对应输出一行,包括出现次数最多的字符和该字符出现的次数,中间是一个空格。如果有多个字符出现的次数相同且最多,那么输出ASCII码最小的那一个字符。
Sample Input
2
abbccc
adfadffasdf
Sample Output
c 3
f 4
#include
int main(void){
int z[30], n, t, g, i, j, a, xia, max;
char ch;
scanf("%d", &t);
for(g=1; g<=t+1; g++){for(i=1; i<=28; i++)
z[i]=0;//记录数组初始化for(i=1; i<=1000; i++){
ch=getchar();
if(ch=='n')
break;
a=ch-'a'+1;
z[a]++;
}//统计到记录数组max=-9;
for(i=1; i<=26; i++){
if(z[i]>max)
{max=z[i]; xia=i;}
}if(g!=1){
ch='a'+xia-1;
printf("%c ", ch);
printf("%dn", max);
}
}
return 0;
}
解决方案
楼主,我帮你看了一个,主要问题是关于C语言在scanf之后,还在输入字符的问题.
我先把改过的代码给出 :
#include <stdio.h>
int main(void)
{
int z[30], n, t, g, i, j, a, xia, max;
char ch;
scanf("%d", &t);
getchar();
for(g=1; g<=t; g++)
{
for(i=1; i<=28; i++)
z[i]=0;//记录数组初始化
for(i=1; i<=1000; i++)
{
ch=getchar();
if(ch=='n')
break;
a=ch-'a'+1;
z[a]++;
}//统计到记录数组
max=-9;
for(i=1; i<=26; i++)
{
if(z[i]>max)
{max=z[i]; xia=i;}
}
ch='a'+xia-1;
printf("%c ", ch);
printf("%dn", max);
}
return 0;
}
这是我自己学C 输入数字,字符、回车的笔记:
c语言中 scanf后面一定要跟个 getchar吃回车吗?
如果后面有个scanf或者getchar()读取字符型的话就会读到回车了(输入流缓冲区会保留回车)。fflush和getchar以及相关的一些函数可以吞掉后面的回车
#include
int main()
{
char a;
scanf("%c",&a);
printf("你输入了%cn",a);
// fflush(stdin); 也可以用getchar()吞掉回车
scanf("%c",&a);
printf("你输入了%cn",a);
return 0;
}
但是为什么把%c换成%d结果就不一样了?
%d 输入的时候,也是输入了数字+ 回车符
这时候就看你下一条 输入语句是什么了 如果也是 %d 那么没问题
如果下一条 是 %c那么就会读取到留在缓冲区里的 回车符号
可以百度 搜索“ C 输数字 字符 回车 ”,看一下第二篇文章
在scanf 之后 可以用 fflush(stdin) 清空缓冲区。
函数名: fflush
功 能: 清除一个流
用 法: int fflush(FILE *stream);
头文件
getch()、getche()和getchar()函数
(1) getch()和getche()函数
这两个函数都是从键盘上读入一个字符。其调用格式为:
getch();
getche();
两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()
函数却将读入的字符回显到显示屏幕上。
例1:
#include
#include //头文件
main()
{
char c, ch;
c=getch(); /*从键盘上读入一个字符不回显送给字符变量c*/
putchar(c); /*输出该字符*/
ch=getche(); /*从键盘上带回显的读入一个字符送给字符变量ch*/
putchar(ch);
}
利用回显和不回显的特点, 这两个函数经常用于交互输入的过程中完成暂停
等功能。
例2:
#include
main()
{
char c, s[20];
printf("Name:");
gets(s);
printf("Press any key to continue..."); //这样不会在打印出这句话后,立即输出Press any key to continue 而是等待你输入一个不回显的回车后,再输出最后一句话。
getch(); /*等待输入任一键*/
}
(2) getchar()函数
函数名: getchar
功 能: 从stdin流中读字符
用 法: int getchar(void);
头文件: #include
getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数
的区别在于: getchar()函数等待输入直到按回车才结束, 回车前的所有输入字
符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。
#include
getchar()函数的调用格式为:
getchar();
例3:
#include
#include
main()
{
char c;
c=getchar(); /*从键盘读入字符直到回车结束*/
putchar(c); /*显示输入的第一个字符*/
getch(); /*等待按任一健*/
}
例4
#include
#include
main()
{
char c;
while ((c=getchar())!='n') /*每个getchar()依次读入一个字符*/
printf("%c",c); /*按照原样输出*/
getch(); /*等待按任一健*/
}
getch()等待读取键盘输入的一个字符,不显示与屏幕上
getche()显示与屏幕上
我想,如果看了上面的笔记应该会帮助楼主。其实楼主的算法没有问题。但是我有一些建议给楼主,在取变量名的时候,最见名知义。
比如,用于统计的数组z[],可以用count[]代替,t可以用times(次数)代替。。 这样,往后自己回看,或者供给他人阅读,都很方便。希望对楼主有用
解决方案二:
lz你把这道题的出处po一下