先从C++自带的读入开始吧。

int n;
cin>>n;

这样的读入简单,但是速度不占优势,适合初学者(虽然我之前一直在用)

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

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

但是!一些毒瘤 题目为了卡你时间,你需要更快(咳咳)的读入方法来完成读入。

这里就涉及到getchar();

这个函数的作用的读入单个字符;

众所周知读入字符比读入数字要快一点(我也不知道为什么)

所以就可以挨个读入字符,然后转成十进制的数返回。

但是在这转化的过程中会涉及到一种新的运算(位运算)

这种运算也是毒瘤

这种运算很常见√

先贴上代码:

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就是位运算操作。

位运算是对相应的二进制数生效的,>>x是把这个二进制数向右平移x位,挤出去的扔掉 ,<<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()只能读入单个字符,当然也包含空格,换行符,所以当读入有太多的空格及换行的时候,还是乖乖的用前面的方法吧。。。

ov.

最后修改:2020 年 01 月 19 日 12 : 55 PM