比“读入优化”更优的读入方式

序:
相信很多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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值