【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 }

 

  其实也没有什么难的,只是经过读入字符然后来转成数字,而原理就是读入字符比数字快(不要问我为何)spa

 

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

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

  " << " 操做为二进制操做中的位移操做,原理是将原二进制数向左平移 x 位,右边原位置以 0 补齐(固然也有向右移的">>",可是这里不用)blog

  例如:ci

   原二进制数 10001   通过 << 2 后,变为 1000100 get

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

      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()函数来计算一下代码优化程度。

相关文章
相关标签/搜索