各種內建函式技巧總結

dengchengyu發表於2024-11-16

各種內建函式技巧總結

數學庫等

  • 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) 反三角函式。

  • \(\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) 排序。
  • maxmin

cstring

  • memset(begin,val,len)\(begin\) 開始的 \(len\)位元組賦值 \(val\)
  • memcpy(begin1,begin2,len)\([begin2,begin2+len)\)\(len\) 個位元組賦值到 \([begin1,begin1+len)\)
  • sizeof x 返回陣列 \(x\) 的總位元組數。

相關文章