當咱們仍是個小蒟蒻的時候,(爲了簡單易懂)都會選擇下面的讀入方式數組
int a; cin>>a;
這個讀入簡單方便,但到後面,小蒟蒻成長了(變成了大蒟蒻)讀的東西多了,讀的也就顯得慢些,因此有了下面的方式函數
int a; scanf("%d",&a);
這樣雖然快了,能經過大部分題了。學習
可是有一些題仍是會卡常,因而快讀出現了。(感受很膩害的樣子)優化
1 inline int read(){ 2 int x=0,f=1; 3 char ch=getchar(); 4 while(ch<'0'||ch>'9'){ 5 if(ch=='-') 6 f=-1; 7 ch=getchar(); 8 } 9 while(ch>='0'&&ch<='9'){ 10 x=(x<<1)+(x<<3)+(ch^48); 11 ch=getchar(); 12 } 13 return x*f; 14 }
其實也沒有什麼難的,只是經過讀入字符然後來轉成數字,而原理就是讀入字符比數字快(不要問我爲何)spa
x=(x<<1)+(x<<3)+(ch^48);
重點是第十行:x=(x<<1)+(x<<3)+(ch^48);code
" << " 操做爲二進制操做中的位移操做,原理是將原二進制數向左平移 x 位,右邊原位置以 0 補齊(固然也有向右移的">>",可是這裏不用)blog
例如:ci
原二進制數 10001 通過 << 2 後,變爲 1000100 get
其效果: x << 1 == x * 2;it
x << 2 == x * 2 * 2;
………………
因此 (x<<1)+(x<<3) ==x*2+x*2*2*2=x*10;
後面的 (ch^48) 效果爲 ch - = '0';
getchar() 爲讀入單個字符(包括空格 ,換行符)
而當讀入數據中有大量空格時,就不要用快讀了。(你想用的話也不是不能夠)
咱們再來看到輸出環節
通常簡單方便使用的下面的方法
int a=0; cout<<a;
到後來,進階了,用了下面的方法
int a=0; printf("%d",a);
然而仍是有些毒瘤題目會卡,咱們就結合快讀來了一發快寫
1 inline void write(int x) 2 { 3 char F[200]; 4 int tmp=x>0?x:-x ; 5 if(x<0)putchar('-') ; 6 int cnt=0 ; 7 while(tmp>0) 8 { 9 F[cnt++]=tmp%10+'0'; 10 tmp/=10; 11 } 12 while(cnt>0)putchar(F[--cnt]) ; 13 }
這個代碼中,咱們用一個char數組存儲,
putchar是單個字符的輸出方式
相信有了這套快讀快寫,你之後的代碼會大大減小時間!
能夠學習clock()函數來計算一下代碼優化程度。