ACM记录:分析排序 + 搜索 + c++各种输入的区别
扫描二维码
随时随地手机看文章
1.遐想
经过快两个礼拜的努力,校ACM已经AC了84题了。我很爱很爱你,84!在今天这个特殊的日子里我愿意为你停留,但是我却不能一直为你停留,这就是现实,我必须用力奔跑,将来才有勇气有资格去面对你。接下来我要疯狂继续AC,进阶人生的地位。恍然间已经22岁,已经 2 年了。路一直在,人已走远!
2.排序
杭电排序系列
自己按照杭电的这个系列做下来,发现大都是水题,拿来练信心的。排序有快速排序,归并排序,堆排序,基数排序,冒泡排序,选择排序...总共八大排序。
3.搜索
在校ACM1001上就有用搜索来做题的(校ACM1001)。在hdu1010上,用
剪枝 + 深度优先搜索(递归实现)比较简单的。
4.c++各种输入的区别
输入操作的原理:程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
问题描述一:(分析scanf()和getchar()读取字符)
scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。
而读取时遇到回车(n)而结束的,这个n会一起读入输入流缓冲区的。
问题描述二:(分析scanf()和gets()读取字符串)
用scanf来读取一个字符串时,scanf()函数取数据是遇到回车、空格、TAB就会停止。
字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。
另外一个函数是可以接受空格的,那就是gets()。
问题描述三:cin<<
该操作符是根据后面变量的类型读取数据。
输入结束条件:遇到Enter、Space、Tab键。
对结束符的处理:丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) (有争议= - =)
总结:
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。