基本原理&具体实现
对于C++
,我们知道使用getchar
读入字符比cin
及scanf
效率要高很多。手写读入模板就是使用getchar
来读入单个字符再组装成一个完整的数。
设我们读入的数为 x x x(初始为 0 0 0),符号为 f f f(非负数为 1 1 1,负数为 0 0 0),当前读入的字符为 c h ch ch。
int x=0,f=1;
char ch=getchar();
第一步我们需要先把非数字字符给读掉。如果这个字符为-
那么说明这个数为负数,我们就令
f
=
−
1
f=-1
f=−1。
while(ch<'0'||ch>'9'){ // ch为非数字字符
if(ch=='-') f=-1;
ch=getchar(); // 记得更新ch
}
第二步我们读入数字字符,每次读入我们令
x
×
10
x\times10
x×10 并加上读入的数字,即ch-'0'
。
while(ch>='0'&&ch<='9'){ // ch为数字字符
x=x*10+ch-'0';
ch=getchar(); // 记得更新ch
}
最后返回结果 return x*f;
。
模板
快读模板:
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*10+ch-'0';
ch=getchar();
}
return x*f;
}
基于for
循环压行的快读模板:
inline int read(){
int x=0,f=1;
char ch=getchar();
for(ch;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
for(ch;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
}