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

  • 相关阅读:
    UVa 1374
    天梯赛L3 004
    redis操作ZSet
    redis操作set集合
    mybatis使用注解开发
    SSM整合之mybatis的别名配置
    mybatis的5.1.10分页插件的使用
    lombok的使用
    JDBC的一个简单工具类
    mybatis的测试
  • 原文地址:https://www.cnblogs.com/hualian/p/11160241.html
Copyright © 2020-2023  润新知