C++ 卡常技巧


updata

  • 2024.03.31 发布此文章

学习引言

卡常,一种编程技巧,在对时间复杂度要求很高时,就可以用这种办法来节省时间。

今天,我们也来学习一下卡常。

技巧 1——善用修饰符

在定义变量前可以加上 register 修饰符,这样在使用时可以加快速度。

在自定义函数前则可以加上 inline,这样也可以加快速度。

技巧 2——输入输出

如果把输入输出速度按从快到慢排序的话,如下:

  1. freadfwrite
  2. readwrite,此函数需自己编写,在下面会讲;
  3. scanfprintf
  4. cin.tiecout.tie
  5. cincout

看到了吧,我们常用的 cincout 是最慢的,所以呢,在卡常的时候,一定不要用 cincout,并且,即始用了 .tie 加速后其实还是和 scanfprintf 相差很远。

readwrite

此函数原理简单,众所周知,getcherputcher 函数是非常快的,但只能输入(输出)单个字符,我们其实也可以用他们一位一位的进行输入(输出),代码如下(不能进行负数操作,负数操作其实很简单,只要加个判断就可以了):

inline long long read() {
   
	register int x=0;register char c=getchar(),f=1;
	for(;c-48>>63||57-c>>63;c=getchar()) if(c==45)f=-1;
	for(;47-c>>63&&c-58>>63;c=getchar()) x=(x<<3)+(x<<1)+(c^48);
	return x*f;
}
inline void write(register long long x) {
   
	if(x-0>>63) putchar(45),x=~x+1;
	if(9-x>>63) write(x/10);
	putchar(x%10^48);
}

技巧 3——对于运算的优化

众所周知,计算机电脑内部存储数据使用的是二进制,而位运算与二进制有直接联系,故系统处理位运算时在效率上有很大优势。但是,要注意,位运算优先级很低的哦!

俗话说:没有对比没有伤害。这里列出了程序执行各种运算所需的时间周期:

运算 执行一次需要的周期
加法/减法 1 1 1
乘法/除法 3 3 3
取模 20 20 20</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值