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

這時就識趣的別用快讀了吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM