快速读取

在正常读入的时候公认 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 }
View Code

浮点数读入:

 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 }
View Code
日后若能有更好的想法,再来完善。 希望看到的大神不吝赐教 orz
原文地址:https://www.cnblogs.com/Taskr212/p/9461208.html