各种内置函数技巧总结

各种内置函数技巧总结

数学库等

  • 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\) 的总字节数。
posted @ 2024-11-16 16:54  dengchengyu  阅读(80)  评论(0)    收藏  举报