(第一篇部落格,寫得不好請見諒)。
一,cin
眾所周知,cin可以讀入非常多的東西:
int這實在是太好理解了,甚至不用寫別的東西,就可以讀入任何數。a;long long b;
double c;
cin>>a>>b>>c;
但是cin有乙個極大的缺點:費時。
根據我多年的水題經驗,cin大概資料到100000就會超時,光在讀入變數上就已經輸了,更不用提後面對變數的處理了;
導致cin慢的根本原因是因為cin預設和stdin保持同步,會消耗大量無用的時間。
各位大佬可能已經想到了:既然保持同步會超時,那麼把同步關了不就好了?
於是有了下面的一段**:
std::ios::sync_with_stdio(false);這段**通常是寫在主函式的開頭,意義是關閉對stdio的相容,可能會對scanf和printf產生影響,但是。。。速度依然比不上scanf。(笑哭)
所以除了字串相關的題目,我都是用scanf或者快讀的。
二,scanf
scanf是c語言中的輸入函式,在c++語言中也可以使用。
相比c++中的輸入流語句(指cin)快很多,但是它要控制格式。。。
下表是一些常用格式
要注意的是ld等於d ,lld才是超長整型(對應long long),對於f則不一樣,lf對應double,f對應float,沒有llf。
還有幾點特殊的要注意:
一,讀入數字時不要在格式控制符裡輸入空格,這樣反而可能出錯。(親身體會)
二,在格式控制符前加數字可以控制寬度,即讀入幾位數,如%5d 表示讀入前五位數。
三,在格式控制符前加*(如%*d)可以忽略指定變數,%*1d%d可以去掉讀入的第一位數字。
三,快讀
平時scanf就基本夠用了,但是遇到一些毒瘤題emmm,還是快讀吧。
快讀基本原理:讀入字元比讀入數字快很多(大概省去了判斷是不是數字的操作??)
先放一段快讀**:
int對於**的解釋:read()
while(c>='
0'&&c<='9')
return x*t;
}
x表示當前的數值,t表示該數是否為負,c是當前讀到的字元。
第二行的while語句可以有效讀掉換行符和空格。
在讀入數字之後,每讀乙個數,就將之前的數乘以10再加上當前的數,讀到空格時停止。
關於如何乘10:左移是位運算,左移1表示將該數的二進位制數全部左移一位,即乘以2,左移三表示左移三位,即乘以2^3=8,加起來為10,使用位運算比乘法省時間。
關於如何加上當前的數:ascll碼中『0』是第48個,48的二進位制表示為110000,字元異或48就可以將數字二進位制的最高兩位(即48)除去,留下當前的數字。
//關於異或:保留兩個數二進位制位數字不相同的位。
注意點:1.左移和右移的運算級低於加減,異或運算比左移和右移更低,要加括號保證優先順序。
2.快讀只能拿來讀指定型別的整數。
喜歡的話記得點個關注哦!
讀入優化 輸出優化 C 詳解
讀入優化 輸出優化 c 詳解 本文主要介紹了c 讀入和輸出的一些性質和優化 希望對讀者有所幫助 大家對這個應該很熟悉了吧?想必最開始接觸 oi 的時候大家寫的輸入輸出就是用的這個吧。其實你做多了題目就會發現這個 cin 和 cout 是非常慢的,因為它從緩衝區中讀入資料。而這個緩衝常常是同步的,因為...
C 讀入優化和輸入優化模板
首先,讀入優化只是針對整數,getchar讀字元是非常快,所以我們就用getchar。getchar每次只能讀一位,所以,每當讀了一位時x 10,為這一位 留位置 舉個例子 現在讀入了123,x為123,再讀入了乙個4,x 10,變為了1230,現在它的最後一位空出來了,正好留給4,x 4,x就變為...
C 讀入輸出優化 附模板(全)
ios sync with stdio false 注意 在使用後進行io操作時不能同時使用cin 與scanf。另外可以進一步加快執行效率。ios sync with stdio false cin.tie 0 int read while ch 0 ch 9 return x w int wri...