在正常读入的时候公认 scanf 比 cin 快,因为 cin 为了与 stdin 保持同步,防止两者混用时指针混乱,但同时会带来许多额外的开销,尽管可以在主函数中添加:
std::ios::sync_with_stdio( false );
来取消 cin 与 stdin 的同步,可以加快 cin 的读入速度,但是在本人测试后,发现 cin 依然比 scanf 慢很多,所以尽量使用 scanf 会比较好,但是在做题时发现仍然存在读入过大时快速读入的方法,就是用 getchar 来代替,getchar 比 scanf 快很多。
而读入字符和字符串时直接可以用 getchar ,但在读入整型数和浮点型数时,就需要对 getchar 加以改造
整形数读入:
1 inline bool scan_d(int &num) 2 { 3 char in;bool IsN=false; 4 in=getchar(); 5 if(in==EOF) return false; 6 while(in!='-'&&(in<'0'||in>'9')) in=getchar(); 7 if(in=='-'){ IsN=true;num=0;} 8 else num=in-'0'; 9 while(in=getchar(),in>='0'&&in<='9'){ 10 num*=10,num+=in-'0'; 11 } 12 if(IsN) num=-num; 13 return true; 14 }
浮点数读入:
1 inline bool scan_lf(double &num) 2 { 3 char in; 4 double Dec = 0.1; 5 bool IsN = false,IsD = false; 6 in = getchar(); 7 if(in == EOF) return false; 8 while(in != '-' && in != '.' && (in < '0' || in > '9')) 9 in = getchar(); 10 if(in == '-') 11 { 12 IsN = true; 13 num = 0; 14 } 15 else if(in == '.') 16 { 17 IsD = true; 18 num = 0; 19 } 20 else num = in - '0'; 21 if(!IsD) 22 { 23 while(in = getchar(),in >= '0' && in <= '9') 24 { 25 num *= 10; 26 num += in - '0'; 27 } 28 } 29 if(in != '.') 30 { 31 if(IsN) num = -num; 32 return true; 33 } 34 else 35 { 36 while(in = getchar(),in >= '0' && in <= '9') 37 { 38 num += Dec * (in - '0'); 39 Dec *= 0.1; 40 } 41 } 42 if(IsN) num = -num; 43 return true; 44 }