快读快写的原理就是利用getchar()和putchar()巨快的特点进行读入,cin、cout就不说了,听说它比scanf还快,很厉害的。
正常版的话就是利用getchar()读入,对读到的数字处理:
1 #include<string> 2 #include<cstring> 3 #include<cstdio> 4 //我也不知道是哪个头文件 5 inline void write(int x) 6 { 7 if(x<0) putchar('-'),x=-x; 8 if(x>9) write(x/10); 9 putchar(x%10+'0'); 10 } 11 inline int read() 12 { 13 int x=0; 14 char ch=getchar(); 15 while(ch>='0'&&ch<='9') 16 { 17 x=(x<<1)+(x<<3)+ch-'0'; 18 ch=getchar(); 19 } 20 return x; 21 }
这个快读是只针对非负整数的,负数的话读入的就是0,但是用的时候还可以判断一下是否为负嘛,不要这么死板。
这个快写是只针对整数的,如果输出空格的话直接写putchar(32),输出换行的话直接写putchar(10),这两句也是可以放在for(;;)的第二个分号后面的(人有多大胆,for有多大产),有时可以少写一对大括号的。
下面的属于那种有模板我也不会背的,巨长无比
/*inline int Read() { int F=1,Num=0; //F是记录数字是否为负数,Num存储读入的数字 char ch=getchar(); //getchar()读取一个字符 while(!isdigit(ch)) //isdigit()判断是否为数字 { if(ch=='-') F=-1; //如果读入的字符是符号,标记F ch=getchar(); //继续读字符 } while(isdigit(ch)) //如果当前读入的字符是数字,则将整个数字全部读入 { Num=Num*10+ch-'0'; //将读入的ASCII字符转换为数字 //或者上面的代码可以这样写:Num=(Num<<1)+(Num<<3)+ch-'0'; ch=getchar(); //读取下一个字符 } return Num*F; //将读取完毕的字符返回 }*/ /*inline long long read() { long long F=1,Num=0; //F是记录数字是否为负数,Num存储读入的数字 char ch=getchar(); //getchar()读取一个字符 while(!isdigit(ch)) //isdigit()判断是否为数字 { if(ch=='-') F=-1; //如果读入的字符是符号,标记F ch=getchar(); //继续读字符 } while(isdigit(ch)) //如果当前读入的字符是数字,则将整个数字全部读入 { Num=Num*10+ch-'0'; //将读入的ASCII字符转换为数字 //或者上面的代码可以这样写:Num=(Num<<1)+(Num<<3)+ch-'0'; ch=getchar(); //读取下一个字符 } return Num*F; //将读取完毕的字符返回 }*/
下面的快读利用了更快的fread();由于它的机制是一下子输入许多字符,所以对于有数字又有
/* char buf[1<<15],*fs,*ft; inline char getc(){ return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:* fs++; } inline int In() { int This=0,F=1; char ch=getc(); while(ch<'0'||ch>'9') { if(ch=='-') F=-1; ch=getc(); } while(ch>='0'&&ch<='9') { This=(This<<1)+(This<<3)+ch-'0'; ch=getc(); } return This*F; }*/