UJC日报036.让C++有更快的输入输出

前言

众所周知,C++自带输入输出
这不废话吗
它长成这个模样

#include<iostream>
using namespace std;
int main(){
    int a;
    cin>>a;
    cout<<a;
    return 0;
}

十分易于理解对吧(当然这个也是初学者最先学的)
也有长这样的

#include<cstdio>
using namespace std;
int main(){
    int a;
    scanf("%d",&a);
    printf("%d",a);
    return 0;
}

快了一点,但并没有达到真正的快

为什么要快读快写

因为部分题卡时间,然后还特毒瘤,cincout因为速度慢,经常TLE,而用scanfprintf时就差几毫秒就能拿到点AC(永远只差几毫秒)
所以快读快写(输入输出挂)应时而生,否则只能疯狂爆TLE

原理

因为C++有一个特性,读单个字符比读数字快(同样输出一个字符也比输出数字快)
于是,快读快写(输入输出挂)用了更快的getcharputchar
快读,是先把字符读入,再转成数字,而快写相反,先把数字转为字符再输出
代码如下

#include<iostream>
using namespace std;
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);
        /*二进制操作
        原理是将原二进制数向左平移 x 位
        右边原位置以 0 补齐*/ 
        ch=getchar();
    }
    return x*f;
}
inline void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        write(x/10);//用递归取上一位 
    }
    putchar(x%10+48);
    /*
    48是0的askii值
    这里取末尾并转为字符输出
    */
}
int a;
int main(){
    a=read();
    write(a);
    return 0;
} 

缺点

卡时间只是一点,有些题的样例会有一大堆空格
比如

1 1      1 12

2      3     3

3  2        1

1       5  2

此时快读已经不适用了,因为快读没法解决空格的问题
到这时就识趣的别用快读了(scanf神教万岁)

posted @ 2024-02-04 07:10  鸣辰君  阅读(10)  评论(0编辑  收藏  举报