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

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

  • 相关阅读:
    PHP 单例 工厂模式 类的重载 抽象 接口
    上传文件
    ThinkPHP3.2中if标签
    JS闭包特性 运算符 DOM操作
    循环数组 连接数据库 AJAX
    ThinkPHP
    TP框架
    MVC框架
    类的自动加载,静态属性静态方法
    魔术方法__get()和set函数
  • 原文地址:https://www.cnblogs.com/qiuchengrui/p/9785561.html
Copyright © 2011-2022 走看看