各种内置函数技巧总结
各种内置函数技巧总结
数学库等
abs(x)取绝对值,自动类型,注意没有abs(__int128)。(int)(x*100+0.5)/100.0四舍五入保留两位小数。printf("%.2lf",x)以double类型输出 \(x\) 保留两位小数,有时不一定四舍五入。long double的格式符是%Lf。
以下函数在函数名末尾加上 l 就是对应的 long double 类型。
-
pow(x,y)指数函数。 -
sqrt(x)开平方。 -
floor(x)向下取整。 -
ceil(x)向上取整。 -
round(x)四舍五入保留整数。 -
log10(x)以double类型返回 \(\log_{10}(x)\)。 -
log2(x)以double类型返回 \(\log_2(x)\)。 -
log(x)以double类型返回 \(\log_e(x)\)。注意我们有 \(\log_a(b)=\dfrac{\log_e(b)}{\log_e(a)}\)。
-
exp(x)返回 \(e^x\)。 -
sin(x),cos(x),tan(x)三角函数。 -
asin(x),acos(x),atan(x)反三角函数。
atan2(y,x),参数分别为纵坐标与横坐标的差值的反正切,可以求极角。 -
\(\pi\) 可以表示为
acos(-1)或acosl(-1)。
builtin 内建函数等
以下宏的参数都是 unsigned int。
__builtin_popcount(x)返回 \(x\) 二进制中 1 的个数。__builtin_clz(x)返回 \(x\) 前导 0 的个数。__builtin_ctz(x)返回 \(x\) 末尾 0 的个数。
它们对应的 unsigned long long 就是:
__builtin_popcountll,__builtin_clzll(x),__builtin_ctzll(x)。
\(\log_2(x)\) 可以表示为 31^__builtin_clz(x),实测它比 __lg(x) 快 \(55\%\)。
__lg(x)
返回 \(\log_2(x)\) 的整数部分,返回值是整型,\(x\) 的范围可达 64 位。
可能会比预处理 lg 数组更优美。
__gcd(x,y)
返回 \(x,y\) 的最大公约数,\(x,y\) 的范围可达 64 位。
实测略比以下代码更快。
int gcd(int x,int y){
if(y==0) return x;
return gcd(y,x%y);
}
lowbit
即 x&(-x)。
算法库
lower_bound(begin,end,val)二分查找第一个大于等于的。upper_bound(begin,end,val)二分查找第一个大于的。unique(begin,end)对排好序的序列去重,返回去重后的末尾地址的下一个地址。sort(begin,end,cmp)排序。max,min。
cstring
memset(begin,val,len)从 \(begin\) 开始的 \(len\) 个字节赋值 \(val\)。memcpy(begin1,begin2,len)把 \([begin2,begin2+len)\) 共 \(len\) 个字节赋值到 \([begin1,begin1+len)\)。sizeof x返回数组 \(x\) 的总字节数。

浙公网安备 33010602011771号