浅谈读入优化
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/