眾所周知,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
這時就識趣的別用快讀了吧!