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.快读只能拿来读指定类型的整数。

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

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

 

原文地址:https://www.cnblogs.com/kafuuchinoQWQ/p/11222306.html