快读快写

· · 算法·理论

long long read(){
    long long x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

快读

首先读入一个数字,我们需要他具体的值 x,和其符号 f(正负)。

int x=0,f=1;

为了实现快读的,我们需要用超快的 \text{getchar()}

char ch=getchar();

然而读入的过程中可能有许多多余的字符,如 \n,\0,a 等等,为了过滤掉他们,我们使用一个库函数 \text{isdigit}(ch)

也就是相当于 c≥'0'\ and\ c≤'9'

在读入的过程中记录符号,最后把数字与符号相乘即可。

long long read(){
    long long x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

快写

如果 x 是负数,输出 - 号,并改成正数。

if(x<0) putchar('-'),x=-x;

如果 x 是两位数,先输出它的前几位,用递归实现。

if(x>9) write(x/10);

最后输出各位。

void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

back