快读快写
ps:getchar()只读入一个字符
快读快写的应用情景:数据量较大时(数据很小的时候没什么用还浪费写代码的时间)
优点:快
应用限制:只能读入整数
原理:通过读入字符的方式来优化数的读入(这里认为字符的输入比传统型整数的输入更快)
快读模板:
inline int read() { int x=0,f=1;//f存储负号 char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }//如果不是数,说明是负号(不会有阴间数据给正号吧) while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();//类似高精度的累加计算总和 return x*f; }
优化的快读模板(我是真没想到这东西也能优化):
优化原理:只不过这个模板在读入速度上进行了优化而已,在原来的模板字符读入的基础上进行了提速。
优点:显然是更快了
char *p1,*p2,buf[100000]; #define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++) int read() { int x=0,f=1; char ch=nc(); while(ch<48||ch>57) { if(ch=='-') f=-1; ch=nc(); } while(ch>=48&&ch<=57) x=x*10+ch-48,ch=nc(); return x*f; }
快写模板:
原理解释:快写其实也是在字符输出(普遍认为字符输出比标准输出流快)的基础上进行按位分解,递归输出的。其基本原理还是先判正负再分解输出的。
void write(int x) { if(x<0) putchar('-'),x=-x;判断正负,若为负,则先输出一个负号,再把接下来要处理的值赋成正值 if(x>9) write(x/10); putchar(x%10+'0');//一位一位输出 return; }