【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 输入。

唯一不同的是这句话:

  1. 原版:
    s=s*10+ch-'0';
  1. 位运算版:
    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 ;
}
  • 思想:

与普通版唯一不同的是:

  1. 实现方式:
  • 原版:递归

  • 位运算版:循环

  1. 判断负数:
  • 原版:直接输出符号

  • 位运算版:输出符号的ASCLL码

  1. 记录:
  • 原版:无需记录,直接输出

  • 位运算版:用字符数组记录数字每一位的ASCLL码,输出时强转 int

3.推荐

Link

超详细,超丰富,强推!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值