关于读入数据优化的写法小结

关于读入优化问题
首先,读入优化这里是只是针对整数,getchar读字符是非常快的,所以我们就用getchar了。(下面都假设输入的数为x)

负数处理
很简单,用一个标志变量f,开始时为1,当读入了’-’时,f变为-1,最后x*=f即可

绝对值部分处理
显然getchar每次只能读一位,所以,每当读了一位时x*=10,为这一位“留位置”。
举个例子:现在读入了123,x为123,再读入了一个4,x*=10,变为了1230,现在它的最后一位空出来了,正好留给4,x+=4,x就变为了1234,当然,这里的’4’是char类型,需要减去’0’才是4,即:x=x*10+s-‘0’(s为当前输入的字符)

while(s<‘0’||s>‘9’)//不是数字字符
在这里插入图片描述
代码
第一种写法:

void read(int &x)//'&'表示引用,也就是说x是一个实参,在函数中改变了x的值就意味着在外面x的值也会被改变
{
    int f=1;//标记正负
    x=0;//归零(这就是潜在bug,有可能传进来时x没有归零)
    char s=getchar();//读入第一个字符
    while(s<'0'||s>'9')//不是数字字符
    {
        if(s=='-')//不能直接把f=-1,有可能输入的不是'-'而是其他乱七八糟的东西
            f=-1;
        s=getchar();//继续读
    }
    while(s>='0'&&s<='9')//是字符(一旦不是字符就意味着输入结束了)
    {
        x=x*10+s-'0';
        s=getchar();
    }
    x*=f;//改变正负
}

简洁一些:

void read(int &x)
{
    int f=1;x=0;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    x*=f;
}

第二种写法

inline int get(){
char ch;bool f = false;
while((ch == getchar())<'0' || ch >'9')
if(ch == '-') f = true;
int res = ch - 48;//48是‘0’字符的ASCLL编码转换数字0 需-48
while((ch == getchar()) >= '0' && ch <= '9')
res = res * 10 + ch -48;
return f ? ~res+1:res;//取反加+1!5值是0,~按位取反,5二进制00000101,取反11111010,代表-6
所以~5-6,要想5-5 就的-6+1 =-5
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章