【C++快讀快輸詳解(快速讀入數字,快速輸出數字)】


  當我們還是個小蒟蒻的時候,(為了簡單易懂)都會選擇下面的讀入方式

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 }

 

  其實也沒有什么難的,只是通過讀入字符而后來轉成數字,而原理就是讀入字符比數字快(不要問我為什么)

 

x=(x<<1)+(x<<3)+(ch^48);

  重點是第十行:x=(x<<1)+(x<<3)+(ch^48);

  " << " 操作為二進制操作中的位移操作,原理是將原二進制數向左平移 x 位,右邊原位置以 0 補齊(當然也有向右移的">>",但是這里不用)

  例如:

   原二進制數 10001   經過 << 2 后,變為 1000100 

   其效果: x << 1 == x * 2;

      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()函數來計算一下代碼優化程度。

 


免責聲明!

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



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