快讀原理
單個字符的讀入速度要比讀入數字快,因此我們以字符的形式先讀入,然后處理計算轉為數字。
代碼
inline int read(){
register int x = 0, t = 1;
register char ch=getchar(); // 讀入單個字符到寄存器
while(ch<'0'||ch>'9'){
if(ch=='-')
t=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48); // 移位與異或
// 第十行可以換成 x = x * 10 + ch - '0'
ch=getchar();
}
return x*t;
}
其中涉及到的移位運算、異或、inline、register
位運算、寄存器涉及計算機組成原理
第十行 x=(x<<1)+(x<<3)+(ch^48);
其中 << 為移位 ^ 為異或
移位
簡單來說移位就是二進制數左移(<<) 或 右移(>>) x位 十進制看來就是乘/除2
其中 x << 1 == x * 2;
x << 3 == x * 2 * 2 * 2;
二者相加也就是 x * 10;
位或
就是數學里次方的符號 ^ 也是format中格式居中對齊的符號表示
簡單說就是 "同0 異1" 相同的兩個數異或為0 不同的異或為1
ch^48
相當於 ch -= '0'
inline
簡單來說就是類似 #define 但是能更進一步的定義函數 能夠提升效率
register
意思是將變量放入寄存器,大幅提升效率
注意 : 讀入中包含大量無用空格時 快讀不太適用
附 快寫代碼
inline void write(int x)
{
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}