前言
在编写代码的时候、做信息题目的时候,如果输入输出的数据量比较大的话,经常一不小心就TLE(Time Limit Exceeded,即速度超限,时间超时,通俗的来说就是爆时间),这种情况下就需要scanf和printf,但是万一这两个家伙也不够用了咋办?那么就该是我们的快读快写闪亮登场啦!
普通快读
上定义
这可以使得代码更加具有可读性
#define f_Getchar() getchar()
#define f_Putchar(ch) putchar(ch)
f_Getchar() 即快速(fast)获取字符
f_Putchar() 即快速输出字符
至于为什么要这样做后面再说
整数输入
int快读
inline void inputI(int* i){
char nagative = 0 ;
char ch = '\0' ;
(*i) = 0 ;
while((ch = f_Getchar()) < 48 || ch > 57)if(ch == '-')nagative = 1 ;
while(ch > 47 && ch < 58){
(*i) = ((*i) << 1) + ((*i) << 3) + (ch & 0xCF) ;
ch = f_Getchar() ;
}
if(nagative)(*i) = -(*i) ;
return ;
}
简单介绍原理:首先获取字符,如果是非数字,则一直获取直到获取到数字,如果有负号则标记。接着获取一段连续的数字字符,转换为数字。
long long快读
inline void inputLL(long long* i){
char nagative = 0 ;
char ch = '\0' ;
(*i) = 0 ;
while((ch = f_Getchar()) < 48 || ch > 57)if(ch == '-')nagative = 1 ;
while(ch > 47 && ch < 58){
(*i) = ((*i) << 1) + ((*i) << 3) + (ch & 0xCF) ;
ch = f_Getchar() ;
}
if(nagative)(*i) = -(*i) ;
return ;
}
原理同上
long long快读(无参数,返回数值)
inline long long inget(){
long long i = 0 ;
char nagative = 0 ;
char ch = '\0' ;
while((ch = f_Getchar()) < 48 || ch > 57)if(ch == '-')nagative = 1 ;
while(ch > 47 && ch < 58){
i = (i << 1) + (i << 3) + (ch & 0xCF) ;
ch = f_Getchar() ;
}
if(nagative)i = -i ;
return i ;
}
原理同上
浮点数输入
float 快读
inline void inputF(float* t){
(*t) = inget() ;
float t2 = 0.0F,p = 0.1 ;
char ch = f_Getchar() ;
while(ch > 47 && ch < 58 && p > 1e-6F){
t2 += (ch ^ '0') * p ;
p *= 0.1 ;
ch = f_Getchar() ;
}
*t += t2 ;
return ;
}
原理:获取两端分开的连续数字字符,前面一段作为整数部分,后面一段作为小数部分。
double 快读
inline void inputD(double* t){
*t = inget() ;
double t2 = 0.0,p = 0.1 ;
char ch = f_Getchar() ;
while(ch > 47 && ch < 58 && p >