c 基礎 數字讀入及優化

2022-08-05 05:57:09 字數 1680 閱讀 7833

(第一篇部落格,寫得不好請見諒)。

一,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...