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

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

 

posted @ 2018-10-14 10:45  青珹  阅读(16151)  评论(2编辑  收藏
Live2D