避免超时方法二 :优化数据输入,浅谈getchar,cin,scanf,fread
做ACM的题目时候,输入输出是很重要的,特别输入的数字很多的时候,很容易影响整个程序的执行时间,下面浅淡C语言c++的输入。
1.最基础的当然是scanf,这里跟getchar一起讲。我一开始很疑惑,使用scanf ("%s",&s)将一个字符串读入s和用getchar一个一个字符读入有什么区别呢?
在理论上,其实没什么太大的区别,而相比而言,getchar会快一点,这就是输入挂的原理了。
2.其实最主要是想说cin和scanf的比较,cin >> s;看起来真的很方便,不用打格式控制符,也正是因为这一点,每次读入数字或者字符,他都要判断后面那个s是什么类型,在某些题目上面他会变得很容易超时,换成scanf效率大大增加。这样的题目其实不常见,但不代表没有。
3.最大的杀器来了,就是读入文件的fread,这个函数不是一般的快,我看网上别人做得测试,这个可以比scanf快个两秒,scanf比cin快个四秒,当然,这个测试的数据是超级大的,否则不会有这个明显的间隔。
一般用cin和scanf都是不会超时的,我们不应该放太大的精力在这方面上,scanf基本可以做到输入方面不拖后腿了,最重要的还是靠算法里面的优化。
最后的大杀器,输入挂,在输入数据极多的情况下可以有很好的优化效果,这里只给出了int的获取方法。要调用的时候直接在主函数写 a = input(); 即可。
输入挂的代码:(能比scanf还要快,有一道线段树的题目输入十分大,用输入挂能比用scanf快0.1s)
int input() { int p = 0, sum = 0, MIN = INF; char ch; ch = getchar(); while(1) { if(ch == "-" || (ch >= "0" && ch <= "9")) break; ch = getchar(); } if(ch == "-") { p = 1; ch = getchar(); } while(ch >= "0" && ch <= "9") { sum = sum * 10 + ch - "0"; ch = getchar(); } return p ? -sum : sum; }
究极读入挂fread const int MAXSIZE=100000020; int bufpos; char buf[MAXSIZE]; void iinit(){ buf[fread(buf,1,MAXSIZE,stdin)]=" "; bufpos=0; } int readint(){ int val=0; for(;buf[bufpos]<"0" || buf[bufpos]>"9";bufpos++); for(;buf[bufpos]>="0" && buf[bufpos]<="9" ;bufpos++) val=val*10+buf[bufpos]-"0"; return val; }
使用fread是先将全部输入直接存到buf这个数组里面,然后使用a = readint()这样的格式提取存进去的整数。
使用fread效率非常高,但是空间花销很大,并不是每道题都适合的。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: fread 快速读入
- 下一篇: 操作系统——实验一.进程管理