输入输出优化集锦

这里主要针对输入。
$ $
$ $

1.最快的,比大多数 $\!\:$ 市面上 $\!\:$ 见到的快不少:

P.S.可以筛掉空格、回车、Tab

inline int read()
{
    register char ch=getchar();
    register int x=0;
    while(!(ch&16))ch=getchar();
    while(ch&16)x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x;
}
inline int sread()
{
    register char ch=getchar();
    register int x=0;
    register bool b=0;
    while(!(ch&16)&&ch!='-')ch=getchar();
    (ch=='-')&&(b=1,ch=getchar());
    while(ch&16)x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    b&&(x=-x);
    return x;
}

fread?不存在的。我太水了。

$ $

2.略慢一点的:

可以筛掉空格、回车、Tab和大小写字母

inline int read()
{
    register char ch=getchar();
    register int x=0;
    while(!(ch&16)&&(ch&64))ch=getchar();
    while((ch&16)&&!(ch&64))x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x;
}
inline int signed_read()
{
    register char ch=getchar();
    register int x=0;
    register bool b=0;
    while(!(ch&16)&&(ch&64)&&ch!='-')ch=getchar();
    (ch=='-')&&(b=1,ch=getchar());
    while((ch&16)&&!(ch&64))x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    b&&(x=-x);
    return x;
}

$ $

3.最常用的,顺便把print()放到这儿:

inline int read()
{
    register char ch=getchar();
    register int x=0;
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x;
}
inline int signed_read()
{
    register char ch=getchar();
    register int x=0;
    register bool b=0;
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    (ch=='-')&&(b=1,ch=getchar());
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    b&&(x=-x);
    return x;
}
inline void print(int x)
{
    if(!x){putchar('0');return;}
    register short cnt=0;
    char ch[11];
    (x&INT_MIN)&&(putchar('-'),x=-x);
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}
inline void unsigned_print(int x)
{
    if(!x){putchar('0');return;}
    register short cnt=0;
    char ch[11];
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}

$ $

4.不需要limits.h的:

inline void print(int x)
{
    if(!x){putchar('0');return;}
    register short cnt=0;
    char ch[11];
    (x&2147483648u)&&(putchar('-'),x=-x);
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}

$ $

$\mathbf{\color{#b10b10}\text{注意以上所有内容都会在输出-2147483648时爆炸}}$

5.最稳定不会炸的版本:

void putstr(const char *ch)//注意没有const会警告
{
    while(*ch)putchar(*(ch++));
}
inline void print(int x)
{
    if(!x){putchar('0');return;}
    if(x==2147483648u){putstr("-2147483648");return;}
    register short cnt=0;
    char ch[11];
    (x&2147483648u)&&(putchar('-'),x=-x);
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}
inline void unsigned_print(int x)
{
    if(!x){putchar('0');return;}
    if(x==2147483648u){putstr("-2147483648");return;}
    register short cnt=0;
    char ch[11];
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}

$ $
这里的print()实测比洛谷日报110 浅谈C++ IO优化——读优输优方法集锦 中没有用fread的版本加上inlineregister之后还要快10%左右,而且不会炸。

$ $

6.其他乱七八糟的:

1.

inline long long readll()
{
    register char ch=getchar();
    register long long x=0;
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
    return x;
}
inline long long signed_readll()
{
    register char ch=getchar();
    register bool b=true;
    register long long x=0;
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    (ch=='-')&&(b=1,ch=getchar());
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    b&&(x=-x);
    return x;
}
inline void print(long long x)
{
    if(!x){putchar('0');return;}
    register short cnt=0;
    char ch[21];
//  (x&-9223372036854775808ll)&&(putchar('-'),x=-x);这个注释是干什么的我就不说了
    (x&LONG_LONG_MIN)&&(putchar('-'),x=-x);
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}
inline void unsigned_print(long long x)
{
    if(!x){putchar('0');return;}
    register short cnt=0;
    char ch[21];
    while(x)ch[cnt++]=x%10+48,x/=10;
    while(cnt--)putchar(ch[cnt]);
}

//wait to be updated


发表于 2019-08-11 22:10:29 in io