各種內建函式技巧總結
數學庫等
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)
排序。max
,min
。
cstring
memset(begin,val,len)
從 \(begin\) 開始的 \(len\) 個位元組賦值 \(val\)。memcpy(begin1,begin2,len)
把 \([begin2,begin2+len)\) 共 \(len\) 個位元組賦值到 \([begin1,begin1+len)\)。sizeof x
返回陣列 \(x\) 的總位元組數。