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 @   鸣辰君  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示