(第一篇博客,写得不好请见谅)。
一,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.快读只能拿来读指定类型的整数。
喜欢的话记得点个关注哦!
(当然不喜欢提意见也是可以的)