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() 为读入单个字符(包括空格 ,换行符)
当然,快读也有不适用的时候,例如读入中包含大量无用空格
这就别用快读了.
建议想提高的同学们,需要认真学一下cin cout scanf printf get input…