updata
- 2024.03.31 发布此文章
学习引言
卡常,一种编程技巧,在对时间复杂度要求很高时,就可以用这种办法来节省时间。
今天,我们也来学习一下卡常。
技巧 1——善用修饰符
在定义变量前可以加上 register
修饰符,这样在使用时可以加快速度。
在自定义函数前则可以加上 inline
,这样也可以加快速度。
技巧 2——输入输出
如果把输入输出速度按从快到慢排序的话,如下:
fread
和fwrite
;read
和write
,此函数需自己编写,在下面会讲;scanf
和printf
;cin.tie
和cout.tie
;cin
和cout
。
看到了吧,我们常用的 cin
和 cout
是最慢的,所以呢,在卡常的时候,一定不要用 cin
和 cout
,并且,即始用了 .tie
加速后其实还是和 scanf
和 printf
相差很远。
read
和 write
此函数原理简单,众所周知,getcher
和 putcher
函数是非常快的,但只能输入(输出)单个字符,我们其实也可以用他们一位一位的进行输入(输出),代码如下(不能进行负数操作,负数操作其实很简单,只要加个判断就可以了):
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</ |