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;
}
快了一点,但并没有达到真正的快
为什么要快读快写
因为部分题卡时间,然后还特毒瘤,cin
和cout
因为速度慢,经常TLE,而用scanf
和printf
时就差几毫秒就能拿到点AC(永远只差几毫秒)
所以快读快写(输入输出挂)应时而生,否则只能疯狂爆TLE
原理
因为C++有一个特性,读单个字符比读数字快(同样输出一个字符也比输出数字快)
于是,快读快写(输入输出挂)用了更快的getchar
和putchar
快读,是先把字符读入,再转成数字,而快写相反,先把数字转为字符再输出
代码如下
#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
神教万岁)