【2023.03.17】快读快写整理
1.普通版
快读:
- 代码:
inline int read(){
int s=0;
int w=1;
char ch;
ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
w=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
- 思想:
s 为基数即最后返回的数,w 用来记录是否为负数。
ch 记录数字每一位,用 getchar 输入更是事半功倍。
快写:
- 代码:
void write(int s){
if(s<0){
putchar('-');
s=-s;
}
if(s>9){
w=-1;
}
putchar(s%10+'0');
}
- 思想:
s 为要输出的数,用递归实现。
若 s 小于零,先输出符号再将 s 变为它本身的相反数。
注意用 putchar 每次只能单位输出
2.位运算版
快读:
- 代码:
inline int read(){
int s=0;
int w=1;
char ch;
ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
w=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=(s<<1)+(s<<3)+(ch^48);
ch=getchar();
}
return s*w;
}
- 思想:
仍然用 s 作为基数即最后返回的数,w 用来记录是否为负数。ch 记录数字每一位,用 getchar 输入。
唯一不同的是这句话:
- 原版:
s=s*10+ch-'0';
- 位运算版:
s=(s<<1)+(s<<3)+(ch^48);
众所周知,位运算要比加减乘除要快得多,由原版到位运算的运算过程大致如下:
(s<<1)+(s<<3)=s*2+s*2*2*2
=2*s*(1+2*2)
=2*5*s
=s*10
快写:
- 代码:
inline void write(int s){
int len=0;
char ch[20];
if(s<0){
putchar((1<<5)+(1<<3)+(1<<2)+1);
s=~s+1;
}
do{
ch[len++]=s%10+(1<<4)+(1<<5);
s/=10;
}while(s>0);
for(int i=len-1;i>=0;i--){
putchar(ch[i]);
}
return ;
}
- 思想:
与普通版唯一不同的是:
- 实现方式:
-
原版:递归
-
位运算版:循环
- 判断负数:
-
原版:直接输出符号
-
位运算版:输出符号的ASCLL码
- 记录:
-
原版:无需记录,直接输出
-
位运算版:用字符数组记录数字每一位的ASCLL码,输出时强转 int
3.推荐
超详细,超丰富,强推!
本文来自博客园,作者:Hzzxx,转载请注明原文链接:https://www.cnblogs.com/xinao2186182144/p/17227466.html