关于快读的一些疑问

P1434 [SHOI2002] 滑雪

0Koto @ 2017-07-29 16:43:57

蒟蒻试着用了这样的快读快写

inline void in(int &x){
    x=0;int f=1;char c=getchar();
    while(!isdigit(c)){f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    x*=f;
}
inline void out(int x){
    if(!x){putchar('0');return;}
    if(x<0){x=~x+1;putchar('-');}
    char c[20]={0};
    while(x){c[++c[0]]=x%10+48;x/=10;}
    while(c[0]) putchar(c[c[0]--]);
}
然后会wa很多点,但改回printf()和scanf()或cin cout就不会wa;是因为用了getchar()吗?

by Sooke @ 2017-07-29 19:51:05

@Adelheid_Bernstein

话说读入优化中的:

x=(x<<3)+(x<<1)+(c^48)

为什么 c^48 而不是 c - 48


by Weng_Weijie @ 2017-07-30 07:52:04

因为你读入一个空格或换行,就会把f变成-1,然后就WA了


by 0Koto @ 2017-07-30 09:00:07

@Sooke 48(‘0’)的二进制是110000,57(‘9’)的二进制是111001,xor就相当于正好把前面的11去掉了


by 0Koto @ 2017-07-30 09:05:20

@Weng_Weijie 大佬说的没错,在f=-1 前加了if(c=='-')就过了,十分感谢


by Sooke @ 2017-07-30 09:25:50

@Adelheid_Bernstein ..


by 0Koto @ 2017-07-30 09:36:51

@Sooke 听说不管怎样一般还是位运算快


by Sooke @ 2017-07-30 11:15:06

@Adelheid_Bernstein 嗯,受到指教了QAQ


by 0Koto @ 2017-07-30 17:13:09

@Sooke 橙名蒟蒻在红名大佬前瑟瑟发抖w


by Alextokc @ 2017-09-02 02:46:58

你这样不如用fread..write..

而且据说位运算版本没有非位运算版本的快在一般情况下..


|