讀入優化 輸出優化

2021-08-21 21:20:43 字數 3365 閱讀 3295

注意了注意了注意了,重要的事情說3遍,這個東西是騙分神器,騙分神器,騙分神器!!!

眾所周知:scanf比cin快得多,printf比cout快得多,如果你不知道就……就現在知道了

那有沒有更快的呢?當然。

請看:

好吧,這就是讀入優化的效果,在資料很恐怖的情況下能比scanf多過1-5個點……

比如說這種:

都說了要讀入優化你還不讀入優化,那不是找死嗎……

前面都是廢話,現在開始說正事

首先,讀入優化這裡是只是針對整數,getchar讀字元是非常快的,所以我們就用getchar了。(下面都假設輸入的數為x)

很簡單,用乙個標誌變數f,開始時為1,當讀入了』-』時,f變為-1,最後x*=f即可

顯然getchar每次只能讀一位,所以,每當讀了一位時x*=10,為這一位「留位置」。

舉個例子:現在讀入了123,x為123,再讀入了乙個4,x*=10,變為了1230,現在它的最後一位空出來了,正好留給4,x+=4,x就變為了1234,當然,這裡的』4』是char型別,需要減去』0』才是4,即:x=x*10+s-'0'(s為當前輸入的字元)

很多時候是有多餘空格或者其他的亂碼字元輸入,為了防止bug,我們要嚴謹~詳見**。

void

read(int

&x)//'&'表示引用,也就是說x是乙個實參,在函式中改變了x的值就意味著在外面x的值也會被改變

while

(s>='0'

&&s<='9'

)//是字元(一旦不是字元就意味著輸入結束了)

x*=f;//改變正負

}

簡潔一些:

void

read(int

&x)while

(s>='0'

&&s<='9'

) x*=f;

}

這就是完整的讀入優化了,你可以直接這樣用:

int n

;read(n

);

當然還有更裝逼的**:

#

define

num ch-'0'

void

get(int

&res)

這個就真的很跳了。

首先:isdigit是判斷乙個字元是否為數字字元,需要標頭檔案#include,剛剛忘了說,getchar需要cstdio。

然後,那個詭異的(ch=='-')&&(flag=true)(flag)&&(res=-res);是個什麼玩意?我們發揮聰明才智,想起&&是「短路運算子」,短路運算子是啥?就是看到第乙個條件錯誤就不會執行第二個條件,直接跳過了,所以這兩句**就不難理解了,唯一顛覆寶寶們的認知的是&&可以脫離if和return什麼的直接用……

如果有50%的人知道輸入優化,那知道輸出優化的最多不過20%,輸出還能怎麼優化?putchar啊!putchar是比printf快的。(下面都假設輸出的數為x)

ps:居然還有putchar這種東西?!

輸出就簡單了,如果是負數,直接putchar('-');x=-x;即可,不解釋。

這裡是不是還是用迴圈呢?答案是——否定的,為了極致的速度,我們用遞迴!遞迴什麼?遞迴下一位啊,即x/10,然後,注意邊界,x要》9才能繼續遞迴,否則要輸出x%10(因為還有最後一位)。

無……

void print

(int

x)//這裡當然不用實參

if(x>9

)//只要x還是2位數或更多就繼續分解

print

(x/10

);//這裡遞迴完後棧裡面x的每一位是倒過來的(關於遞迴,我也實在解釋不清楚,各位去看看神犇們的遞迴解釋吧)

putchar(x%10

+'0'

);//輸出(要把int型變為char型,加'0'即可)

}

至於輸出優化,目前還沒發現什麼太跳的,畢竟寫輸出優化的就少。

為了能看出優勢,我做了乙個對比:

test.cpp:

#include

#include

#include

using

namespace

std;#define times 1000000

double

a[5];void

print(int

x)void

read(int

&x)while

(s>='0'

&&s<='9'

) x*=f;

}int

main()

data.cpp:

#include

#include

#include

#define times 1000000

#define maxn 100000

int main()

}

如果你想測cin,cout,自己試試吧……

以下是我的測試結果(測5次,資料一模一樣):

次數scanf耗時

read耗時

printf耗時

print耗時

10.2960 s

0.0790 s

0.1870 s

0.0630 s

20.2960 s

0.0940 s

0.1720 s

0.0630 s

30.2810 s

0.0780 s

0.1870 s

0.0630 s

40.2960 s

0.0790 s

0.1870 s

0.0470 s

50.2970 s

0.0780 s

0.1720 s

0.0630 s

這裡用了1000000組資料,輸入優化比scanf快了約0.2秒,也就是說,每50萬組資料讀入優化要快0.1秒(100ms),剛好符合了最開始的資料範圍。

讀入輸出優化

1 void read int x 表示引用,也就是說x是乙個實參,在函式中改變了x的值就意味著在外面x的值也會被改變212 while s 0 s 9 是字元 一旦不是字元就意味著輸入結束了 1317 x f 改變正負 18 1 void print int x 這裡不用實參28 if x 9 只...

讀入優化和輸出優化

前兩天做牛客的題 才知道有這麼個玩意。果然還是太菜 大佬們打比賽是去切題 我是去認識新名詞。題目也很直白 說了 讀入檔案較大,請使用讀入優化,本機除錯時請使用檔案輸入輸出而且題目 也給出了優化寫法 可以直接用 非常良心 inline int read while c 0 c 9 x x 10 c 0...

讀入優化與輸出優化

c 是一門神奇的學科。在讀入 輸出時,我們經常用到 scanf cin printf cout 但是,在演算法競賽中,我們奉行乙個原則 效率第一!於是,便產生了各種各樣的奇技淫巧。下面的讀入與輸出優化就是其中之一。讀入優化 c 自帶的 scanf 已經很快了,但是100w的資料要0.6 0.8s,很...