首页 学习笔记

  当我们还是个小蒟蒻的时候,(为了简单易懂)都会选择下面的读入方式

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 位,右边原位置以 0 补齐(当然也有向右移的">>",但是这里不用)

  例如:

  原二进制数 10001 经过 << 2 后,变为 1000100

  其效果: x << 1 == x * 2;

     x << 2 == x 2 2;

     ………………

  所以 (x<<1)+(x<<3) ==x2+x222=x*10;

  后面的 (ch^48) 效果为 ch - = '0';

  getchar() 为读入单个字符(包括空格 ,换行符)

  而当读入数据中有大量空格时,就不要用快读了。(你想用的话也不是不可以)


  我们再来看到输出环节

  一般简单方便使用的下面的方法

int a=0;
cout<<a;

 到后来,进阶了,用了下面的方法

int a=0;
printf("%d",a);

然而还是有些毒瘤题目会卡,我们就结合快读来了一发快写

inline void write(int x){
    x<0?putchar('-'):0;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}



文章评论

目录