快速輸入輸出類(C++)
阿新 • • 發佈:2018-12-20
我們知道,cin/cout是很慢的,所以我們經常scanf/printf。但是如果要求更嚴格一些,速度要更快,該怎麼辦呢?有一種解決辦法,那就是——快速輸入輸出。
快速輸入輸出採用getchar()和putchar()函式,用了數字累加的方法輸入/輸出數。
我們也可以把快速輸入輸出定義成類,就像cin/cout一樣。
程式碼如下:
//qio.h #ifndef MY_QIO_H #define MY_QIO_H #include<cstdio> #include<cmath> #define E_MINUS(i) pow(0.1,i) #define E_PLUS(i) pow(10,i); using std::getchar; using std::pow; using std::putchar; //assistant function(al)s struct precision_class{ struct prec_type{ int prec; }; prec_type operator () (int precision__){ prec_type ans={precision__}; return ans; } }precision; //qin class q_istream{ public: q_istream operator >> (int &int_num){ int_num=0; bool is_nag=0; for(int i=0;;++i){ char c=getchar(); if(c==' '||c=='\t'||c=='\n'||c==EOF) break; if(i==0 && c=='-'){ is_nag=1; continue; } if(i==0 && c=='+') continue; int_num*=10; int_num+=c-48; } if(is_nag) int_num=-int_num; return *this; } q_istream operator >> (long long &long_long_num){ long_long_num=0; bool is_nag=0; for(int i=0;;++i){ char c=getchar(); if(c==' '||c=='\t'||c=='\n'||c==EOF) break; if(i==0 && c=='-'){ is_nag=1; continue; } if(i==0 && c=='+') continue; long_long_num*=10; long_long_num+=c-48; } if(is_nag) long_long_num=-long_long_num; return *this; } q_istream operator >> (unsigned long long &unsigned_long_long_num){ unsigned_long_long_num=0; bool is_nag=0; for(int i=0;;++i){ char c=getchar(); if(c==' '||c=='\t'||c=='\n'||c==EOF) break; unsigned_long_long_num*=10; unsigned_long_long_num+=c-48; } if(is_nag) unsigned_long_long_num=-unsigned_long_long_num; return *this; } q_istream operator >> (double &double_num){ double_num=0; bool is_nag=0; for(int i=1;;++i){ char c=getchar(); if(c=='.') break; if(i==1 && c=='-'){ is_nag=1; continue; } if(i==1 && c=='+') continue; double_num*=10; double_num+=c-48; } for(int i=1;;++i){ char c=getchar(); if(c==' '||c=='\t'||c=='\n'||c==EOF) break; double_num+=E_MINUS(i)*(c-48); } if(is_nag) double_num=-double_num; return *this; } }qin; //qout class q_ostream{ private: int precision; public: q_ostream(){ precision=4; } q_ostream operator << (int int_num){ char arr[20]; int i=0; if(int_num<0) putchar('-'),int_num=-int_num; while(int_num>0){ arr[i++]=(int_num%10+48); int_num/=10; } while(i>0){ putchar(arr[--i]); } return *this; } q_ostream operator << (long long long_long_num){ char arr[30]; int i=0; if(long_long_num<0) putchar('-'),long_long_num=-long_long_num; while(long_long_num>0){ arr[i++]=(long_long_num%10+48); long_long_num/=10; } while(i>0){ putchar(arr[--i]); } return *this; } q_ostream operator << (double double_num){ if(double_num<0) putchar('-'),double_num=-double_num; int int_num=double_num; if(int_num){ char arr[20]; int i=0; if(int_num<0) putchar('-'),int_num=-int_num; while(int_num>0){ arr[i++]=(int_num%10+48); int_num/=10; } while(i>0){ putchar(arr[--i]); } } else putchar('0'); int_num=double_num; if(double_num-int_num<=E_MINUS(precision)) return *this; putchar('.'); long long long_long_num=(double_num-int_num)*E_PLUS(precision); { char arr[30]; int i=0; while(long_long_num>0){ int num_10=long_long_num%10; arr[i++]=(num_10+48); long_long_num/=10; } bool bef0=1; while(i>0){ putchar(arr[--i]); } } return *this; } q_ostream operator << (precision_class::prec_type precision_num){ precision=precision_num.prec; return *this; } }qout; #endif
其實,快速輸出並不快,甚至比cout還要慢。
現在可以快速地輸入一個數了!
——但是,你們測試了嗎?你們有沒有發現qout輸出浮點數有點問題?因為qout輸出浮點數最後一位是用去尾法輸出的,所以會有問題!有時候,由於精度的原因,原來的數(比如1.23)會減一點點,可能只有1e-12,但是因為是去尾法,結果就變成了1.2299。如果是1.2345,那就有可能變成1.2344。所以——互動來了!在評論區中回覆q_ostream operator << (double double_num)的改進方案(C++程式碼),測試通過(系統:Windows,IDE:Dev-C++,編譯器:g++)的就會有獎勵:如果你寫了文章(原創/轉載/翻譯均可),那麼我會在幾篇文章(最多3篇,如果文章數量不夠3篇,那麼我會全點贊)中點贊。(截止時間:2018年12月31日23:59)
好,我最後說一下使用方法。
- 一般按cin/cout的方式,如 int a; qin>>a;
- 如果輸出需要小數精度控制,用 qout<<precision(精度) 來調整精度。
只許轉載程式碼和使用方法。(互動部分不許轉載!)轉載時請附上本文連結: https://blog.csdn.net/weixin_41461277/article/details/84863301 。