序:
相信很多OIer在读取大量数据的时候普遍采取读入优化的方式读入(代码如下,基本类似):
inline void read()//无符号型
{
static char c;
input = 0;
c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9')
{
input = input*10+c-'0';
c = getchar();
}
//return input;
return ;
}
通过其他博客我们发现比这样更快的是fread,可惜不会用…
经过寻找,在知乎上找到了比读入优化更快的方法。
测试表明比读入优化快10%。
代码如下:
char buffer[maxn],*S,*T;
inline char Get_Char()
{
if(S==T)
{
T=(S=buffer)+fread(buffer,1,maxn,stdin);
if(S==T) return EOF;
}
return *S++;
}
int Get_Int()
{
char c;
int re=0;
for(c=Get_Char();c<'0'||c>'9';c=Get_Char());
while(c>='0'&&c<='9')
re=(re<<1)+(re<<3)+(c-'0'),c=Get_Char();
return re;
}
对比读入优化读入一千万个的无符号型int型整数(循环10次)。
结果如下:
5.778000 0.577800(传统)
5.078000 0.507800(新)
在知乎上的讨论还给出了几种很快的读入方式,但是代码格式比较混乱或太长,故不附代码。
原答案地址:如何看待在OI/ACM赛事广为使用的快速读入整数?
自此整理结束。
箜瑟_qi 2017.04.15 17:21