C/C++快讀(快速讀入)有多——安全AC


在一些算法題目中中,有的程序會被卡常(數),就是說,程序雖然漸進復雜度可以接受,但因為算法本身的時間常數過大,導致程序在一些算法競賽中超時。這是,快讀就顯得尤為重要了。

當然,如果程序算法本身就不高效,快讀就更加重要了,可以讓一些暴力程序獲得更多的測試點分數,如果數據不大甚至能AC,此時快讀就是“得分法寶”

快速讀入可以讓大家的輸入更快,這里做了一個測試:快讀究竟有多快?(編譯器dev-c++ 5.5.3,標准模式(非debug))

 1 #include <cstdio>
 2 #include <ctime>
 3 #include <iostream>
 4 #define LOOP 2 //循環次數
 5 #define DATA 100000 //數據規模
 6 struct dat{  7     int i,s,c;dat(int a=0,int b=0,int k=0){i=a,s=b,c=k;}  8 }dats[100+1];  9 inline int Readi(){//快讀 
10     int x; 11     int fh=1; 12     char a=getchar(); 13     while('0'>a || '9'<a){//首先過濾掉非數字字符(注意符號的處理) 
14         if(a=='-') fh=-1; 15         a=getchar(); 16  } 17     while('0'<=a && a<='9'){//小技巧:x=x*10 可以進位 
18         x=x*10+a-'0'; 19         a=getchar(); 20  } 21     return x*fh; 22 } 23 void TryPrint(){ 24     FILE* fp=fopen("in.txt","w");//輸出數據 
25     for(int i=1;i<=DATA;++i)fprintf(fp,"%d ",i); 26     fclose(fp);//關閉文件 27     //一定要注意,不關閉文件,數據會寫到緩沖區里,可能會丟數據) 
28 } 29 void TryReadi(){ 30     int t;for(int i=1;i<=DATA;++i)t=Readi(); 31 } 32 void TryReads(){ 33     int t;for(int i=1;i<=DATA;++i)scanf("%d",&t); 34 } 35 void TryReadc(){ 36     int t;for(int i=1;i<=DATA;++i)std::cin>>t; 37 } 38 int main(){ 39     freopen("out.txt","a",stdout); 40     printf("數據規模:%d 循環次數:%d 單位:ms\n",DATA,LOOP); 41     freopen("in.txt","r",stdin);//讀入數據文件(只讀)
42     for(int k=1;k<=LOOP;++k){ 43         freopen("out.txt","a",stdout); 44         freopen("in.txt","r",stdin);//讀入數據文件(只讀)
45         TryPrint();clock_t p=clock(); 46         TryReadi();clock_t i=clock(); 47         TryReads();clock_t s=clock(); 48         printf("快讀:%u\n",i-p); 49         printf("scanf輸入:%u\n",s-i); 50         dats[k]=dat(i-p,s-i,0); 51  } 52     double sum=0.0;for(int k=1;k<=LOOP;++k)sum+=dats[k].i;printf("快讀平均:%.0f\n",sum/LOOP); 53     sum=0.0;for(int k=1;k<=LOOP;++k)sum+=dats[k].s;printf("scanf平均:%.0f",sum/LOOP); 54     return 0; 55 }
View Code

 

快速讀入代碼:大家可以自己修改,在自己電腦上測試(注意:cin這里我在測試時出現了讀入都是零的問題,導致時間過少,求各位大神解決)

測試結果

數據規模:1000000 循環次數:5 單位:ms
快讀:50
scanf輸入:1113
快讀:50
scanf輸入:1130
快讀:58
scanf輸入:1116
快讀:52
scanf輸入:1168
快讀:51
scanf輸入:1130
快讀平均:52
scanf平均:1131

由此得,快讀比scanf快了很多。所以大家在讀入較大數據規模時,應嘗試快讀。

在我的測試中,快寫就沒有快讀那么神奇了,反而比scanf/printf更慢,可能是由於進行了過多的除法和取余數


免責聲明!

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



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