C++中的快讀和快寫


快讀原理

單個字符的讀入速度要比讀入數字快,因此我們以字符的形式先讀入,然后處理計算轉為數字。

代碼

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');
}


免責聲明!

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



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