zoukankan      html  css  js  c++  java
  • C++手写快读详解(快速读入数字)

    众所周知,C++里是自带读入的(这不废话吗)

    例如:

    int a;
        cin>>a;

    这样的读入理解简单,适合初学者,但是非常慢。

    再例如:

    int a;
        scanf("%d",&a);

    这样的读入就比较快了,也较好理解,在题目不卡时间的情况下可以通过大部分题。

    ——但是,还不够快。

    有一些毒瘤题目是非常卡时间的,稍微慢一点就过不去,因此,快读应运而生:

    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            x=(x<<1)+(x<<3)+(ch^48);
            ch=getchar();
        }
        return x*f;
    }

    原理其实也不难,我们知道,单个读入字符要比读入数字快得多(别问我,我也不知道为什么)

    因此我们可以以字符的形式读入,然后自己计算出数字

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

    " << x" 操作为二进制操作,原理是将原二进制数向左平移 x 位,右边原位置以 0 补齐

    例如:

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

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

          x << 2 == x * 2 * 2;

          x << 3 == x * 2 * 2 * 2;

          ………………

    所以 (x<<1)+(x<<3) 可视为 x * 10;

    后面的 (ch^48) 效果为 ch - = '0';

     

    getchar() 为读入单个字符(包括空格 ,换行符)

    当然,快读也有不适用的时候,例如读入中包含大量无用空格

    1 1      1 12
    2      3     3
    3  2        1
    1       5  2

    这时就识趣的别用快读了吧!

  • 相关阅读:
    [引]Windows Server 2003 : 服务器群集
    周国平:(爱情)永远未完成
    企业管理常用缩写术语之中英文对照表(含解释)
    微软相关中文网站
    陈安之:NAC神经链调正术
    学会不要再争吵
    Oracle基础学习四:字符串 数字 日期 等 相关函数
    贪多嚼不烂
    frameset 框架传值点滴
    陈安之成功的十个关键
  • 原文地址:https://www.cnblogs.com/qiuchengrui/p/9785561.html
Copyright © 2011-2022 走看看