C++手写快读详解(快速读入数字)

Posted qiuchengrui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++手写快读详解(快速读入数字)相关的知识,希望对你有一定的参考价值。

众所周知,C++里是自带读入的(这不废话吗)

例如:

int a;
    cin>>a;

这样的读入理解简单,适合初学者,但是非常慢。

再例如:

int a;
    scanf("%d",&a);

这样的读入就比较快了,也叫好理解,在题目不卡时间的情况下可以通过大部分题。

 

——但是,还不够快。

 

有一些毒瘤题目是非常卡时间的,稍微慢一点就过不去,因此,快读应运而生:

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<0||ch>9){
        if(ch==-)
            f=-1;
        ch=getchar();
    }
    while(ch>=0&&ch<=9){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

原理其实也不难,我们知道,单个读入字符要比读入数字快得多(别问我,我也不知道为什么)

因此我们可以以字符的形式读入,然后自己计算出数字

 

重点是第十行:x=(x<<1)+(x<<3)+(ch^48);

" << x" 操作为二进制操作,原理是将原二进制数向左平移 x 位,右边原位置以 0 补齐

例如:

 原二进制数 10001   经过 << 2 后,变为 1000100 

 其效果: x << 1 == x * 2;

      x << 2 == x * 2 * 2;

      x << 3 == x * 2 * 2 * 2;

      ………………

所以 (x<<1)+(x<<3) 可视为 x * 10;

后面的 (ch^48) 效果为 ch - = ‘0‘;

 

getchar() 为读入单个字符(包括空格 ,换行符)

 

当然,快读也有不适用的时候,例如读入中包含大量无用空格

1 1      1 12
2      3     3
3  2        1
1       5  2

这时就识趣的别用快读了吧!

 

以上是关于C++手写快读详解(快速读入数字)的主要内容,如果未能解决你的问题,请参考以下文章

快读(快速读入)有多快(未完结)

快读与快写的实现

常用快速读入快速输出

模板1——快速读入

大数据-快读

手写数字识别——基于全连接层和MNIST数据集