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
神教万岁)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】