zoukankan      html  css  js  c++  java
  • c++基础--数字读入及优化

    (第一篇博客,写得不好请见谅)。

    一,cin

    众所周知,cin可以读入非常多的东西:

    int a;
    long long b;
    double c; cin>>a>>b>>c;

    这实在是太好理解了,甚至不用写别的东西,就可以读入任何数。

    但是cin有一个极大的缺点:费时。

    根据我多年的水题经验,cin大概数据到100000就会超时,光在读入变量上就已经输了,更不用提后面对变量的处理了;

    导致cin慢的根本原因是因为cin默认和stdin保持同步,会消耗大量无用的时间。

    各位大佬可能已经想到了:既然保持同步会超时,那么把同步关了不就好了?

    于是有了下面的一段代码:

    std::ios::sync_with_stdio(false);

    这段代码通常是写在主函数的开头,意义是关闭对stdio的兼容,可能会对scanf和printf产生影响,但是。。。速度依然比不上scanf。(笑哭)

    所以除了字符串相关的题目,我都是用scanf或者快读的。

    二,scanf

    scanf是c语言中的输入函数,在c++语言中也可以使用。

    相比c++中的输入流语句(指cin)快很多,但是它要控制格式。。。

    下表是一些常用格式

    要注意的是    ld等于d ,lld才是超长整型(对应long long),对于f则不一样,lf对应double,f对应float,没有llf。

    还有几点特殊的要注意:

    一,读入数字时不要在格式控制符里输入空格,这样反而可能出错。(亲身体会)

    二,在格式控制符前加数字可以控制宽度,即读入几位数,如%5d 表示读入前五位数。

    三,在格式控制符前加*(如%*d)可以忽略指定变量,%*1d%d可以去掉读入的第一位数字。

    三,快读

    平时scanf就基本够用了,但是遇到一些毒瘤题emmm,还是快读吧。

    快读基本原理:读入字符比读入数字快很多(大概省去了判断是不是数字的操作??)

    先放一段快读代码:

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

    对于代码的解释:

           x表示当前的数值,t表示该数是否为负,c是当前读到的字符。

           第二行的while语句可以有效读掉换行符和空格。

           在读入数字之后,每读一个数,就将之前的数乘以10再加上当前的数,读到空格时停止。

           关于如何乘10:左移是位运算,左移1表示将该数的二进制数全部左移一位,即乘以2,左移三表示左移三位,即乘以2^3=8,加起来为10,使用位运算比乘法省时间。

           关于如何加上当前的数:ascll码中‘0’是第48个,48的二进制表示为110000,字符异或48就可以将数字二进制的最高两位(即48)除去,留下当前的数字。

           //关于异或:保留两个数二进制位数字不相同的位。

    注意点:1.左移和右移的运算级低于加减,异或运算比左移和右移更低,要加括号保证优先级。

                       2.快读只能拿来读指定类型的整数。

    喜欢的话记得点个关注哦!

    (当然不喜欢提意见也是可以的)

     

  • 相关阅读:
    vss
    JavaScript中的5种事件使用方式解说
    loadrunner
    NET体系结构图
    eclipse Java Build Path
    httpModules 与 httpHandlers
    redhat linux5 安装配置 JDK1.6+Tomcat6+Apache2.2.x+jk_mod1.2
    如何在线使用MSDN
    petshop
    ADO.NET Entity Framework 使用数据定义语言(实体框架)
  • 原文地址:https://www.cnblogs.com/kafuuchinoQWQ/p/11222306.html
Copyright © 2011-2022 走看看