【C++快读快输详解(快速读入数字,快速输出数字)】
当我们还是个小蒟蒻的时候,(为了简单易懂)都会选择下面的读入方式
int a;
cin>>a;
这个读入简单方便,但到后面,小蒟蒻成长了(变成了大蒟蒻)读的东西多了,读的也就显得慢些,所以有了下面的方式
int a;
scanf("%d",&a);
这样虽然快了,能通过大部分题了。
但是有一些题还是会卡常,于是快读出现了。(感觉很腻害的样子)
1 inline int read(){
2 int x=0,f=1;
3 char ch=getchar();
4 while(ch<'0'||ch>'9'){
5 if(ch=='-')
6 f=-1;
7 ch=getchar();
8 }
9 while(ch>='0'&&ch<='9'){
10 x=(x<<1)+(x<<3)+(ch^48);
11 ch=getchar();
12 }
13 return x*f;
14 }
其实也没有什么难的,只是通过读入字符而后来转成数字,而原理就是读入字符比数字快(不要问我为什么)
x=(x<<1)+(x<<3)+(ch^48);
重点是第十行:x=(x<<1)+(x<<3)+(ch^48);
" << " 操作为二进制操作中的位移操作,原理是将原二进制数向左平移 x 位,右边原位置以 0 补齐(当然也有向右移的">>",但是这里不用)
例如:
原二进制数 10001 经过 << 2 后,变为 1000100
其效果: x << 1 == x * 2;
x << 2 == x * 2 * 2;
………………
所以 (x<<1)+(x<<3) ==x*2+x*2*2*2=x*10;
后面的 (ch^48) 效果为 ch - = '0';
getchar() 为读入单个字符(包括空格 ,换行符)
而当读入数据中有大量空格时,就不要用快读了。(你想用的话也不是不可以)
我们再来看到输出环节
一般简单方便使用的下面的方法
int a=0; cout<<a;
到后来,进阶了,用了下面的方法
int a=0; printf("%d",a);
然而还是有些毒瘤题目会卡,我们就结合快读来了一发快写
1 inline void write(int x) 2 { 3 char F[200]; 4 int tmp=x>0?x:-x ; 5 if(x<0)putchar('-') ; 6 int cnt=0 ; 7 while(tmp>0) 8 { 9 F[cnt++]=tmp%10+'0'; 10 tmp/=10; 11 } 12 while(cnt>0)putchar(F[--cnt]) ; 13 }
这个代码中,我们用一个char数组存储,
putchar是单个字符的输出方式
相信有了这套快读快写,你以后的代码会大大减少时间!
可以学习clock()函数来计算一下代码优化程度。