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++手写快读详解(快速读入数字)的主要内容,如果未能解决你的问题,请参考以下文章