浅谈读入优化

cin为什么慢?因为你不需要指定变量的类型。可是scanf为什么还有点慢?(以下为引用)“scanf是可以读取所有类型的值的,而getchar是一个宏,且只能读取int类型的,当然快很多拉”。所以上手getchar,让变量读取更快。至于要把char类型的字符变成整形变量,就要用到ASCII码。

getchar()也有缺点,无论空格(32)还是换行符(10),都可以被读入。我们需要数字,而0(48)和9(57)恰好连续,只要ASCII码在48与57之间,就确定是数字了。因为不清楚文件里会给出多少空格,所以用while循环。

char c=getchar();
while(c<'0'||c>'9') c=getchar();

于是当循环结束时,字符c中已经有了一个数字。还是因为不知道数字有多长,所以继续用while。

可是作为字符的数字,其本质只是一个符号,和整形变量(int)还是有很大差别。这里又借用ASCII码,0(48),1(49)......8(56),9(57);用当前数字的ASCII码减去0(48),返回的是一样的数字

while(c>='0'&&c<='9'){
    x=x*10+c-'0';
    c=getchar();
}

还可以优化,x*10=(x<<1)+(x<<3)。要读入负数怎么办?很明显负号要在数字前,特判一下就可以。

int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}

 最后广告区:欢迎访问https://www.oixgdfz.top/about/

posted @ 2019-07-19 15:26  P-E-K-K-A  阅读(251)  评论(0编辑  收藏  举报