C++中关于数学的一些语法回忆(2)

张开发
2026/6/9 13:13:52 15 分钟阅读
C++中关于数学的一些语法回忆(2)
蓝桥杯 / 算法竞赛数学部分常用 C 语法速查表一、基础数学运算1. 绝对值abs(x) // 整数绝对值 fabs(x) // 浮点数绝对值例子cout abs(-7) \n; // 7 cout fabs(-3.14) \n; // 3.142. 最大值、最小值max(a, b) min(a, b)多个数max({a, b, c}) min({a, b, c})3. 交换swap(a, b);4. 平方、立方竞赛里推荐直接写x * x x * x * x不要太依赖pow(x, 2) pow(x, 3)因为pow返回浮点数整数题容易出精度问题。二、开方、幂、对数1. 开平方sqrt(x)例子double d sqrt(25.0); // 52. 幂函数pow(a, b)表示 (a^b)例子cout pow(2, 10) \n; // 1024但整数题里更推荐快速幂。3. 对数函数log(x) // 自然对数 ln(x) log10(x) // 常用对数 log2(x) // 以2为底例子cout log2(8) \n; // 3三、取整相关1. 向下取整floor(x)例子floor(3.9) // 3 floor(-3.9) // -42. 向上取整ceil(x)例子ceil(3.1) // 4 ceil(-3.1) // -33. 四舍五入round(x)例子round(3.6) // 4 round(3.4) // 34. 正数四舍五入常见写法(long long)(x 0.5)只适合x 0。四、三角函数与几何常用1. 三角函数sin(x) cos(x) tan(x)注意参数必须是弧度。2. 反三角函数asin(x) acos(x) atan(x)3. 求极角最重要atan2atan2(y, x)作用求点(x, y)相对原点的方向角。它比atan(y / x)更稳因为能判断象限不怕除 0几何题标准写法4. π 的写法const double PI acos(-1.0);5. 角度转弧度double rad deg * PI / 180.0;6. 弧度转角度double deg rad * 180.0 / PI;五、整除、取模、余数1. 整数除法a / b如果a、b都是整数那么结果仍是整数。7 / 3 22. 取模a % b例子7 % 3 13. 保证模结果非负((a % mod) mod) % mod这个在数论题里很常见。六、最大公约数、最小公倍数1.gcdgcd(a, b)C17 可直接用。2.lcmlcm(a, b)或者手写a / gcd(a, b) * b注意先除后乘防止溢出。3. 手写 gcdlong long gcd_ll(long long a, long long b) { return b ? gcd_ll(b, a % b) : a; }七、快速幂这个非常高频。1. 普通快速幂long long qpow(long long a, long long b) { long long res 1; while (b) { if (b 1) res * a; a * a; b 1; } return res; }2. 模意义快速幂long long qpow(long long a, long long b, long long mod) { long long res 1 % mod; a % mod; while (b) { if (b 1) res res * a % mod; a res a * a % mod; b 1; } return res; }上面这段有误正确写法应是long long qpow(long long a, long long b, long long mod) { long long res 1 % mod; a % mod; while (b) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; }这个你最好背下来。八、质数相关1. 判断质数bool isPrime(long long n) { if (n 2) return false; for (long long i 2; i * i n; i) { if (n % i 0) return false; } return true; }更稳一点写for (long long i 2; i n / i; i)避免i * i溢出。2. 埃氏筛const int N 1000000; bool is_prime[N 1]; void sieve() { fill(is_prime, is_prime N 1, true); is_prime[0] is_prime[1] false; for (int i 2; i * i N; i) { if (is_prime[i]) { for (int j i * i; j N; j i) { is_prime[j] false; } } } }九、组合数学常用1. 阶乘long long fact(int n) { long long res 1; for (int i 1; i n; i) res * i; return res; }2. 组合数long long C(int n, int k) { if (k 0 || k n) return 0; if (k n - k) k n - k; long long res 1; for (int i 1; i k; i) { res res * (n - i 1) / i; } return res; }十、精度控制1. 固定小数位输出cout fixed setprecision(6) x \n;需要#include iomanip2. 浮点数判等不要直接写if (a b)应该写const double eps 1e-9; if (fabs(a - b) eps)3. 判断大小if (a b - eps) if (a b eps)十一、常见位运算里的数学用法1. 判断奇偶x 12. 除以 2x 13. 乘以 2x 14. 判断第 k 位是不是 1(x k) 1十二、竞赛里很常见的“防溢出写法”1. 乘法转 long long1LL * a * b这个你一定要熟。例如long long area 1LL * w * h;2. 判断平方时小心溢出for (long long i 1; i n / i; i)比i * i n更稳。十三、随机数1. 常见竞赛随机数mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());生成区间随机数uniform_int_distributionint dist(1, 100); cout dist(rng) \n;十四、常见数学模板1. gcd lcmlong long gcd_ll(long long a, long long b) { return b ? gcd_ll(b, a % b) : a; } long long lcm_ll(long long a, long long b) { return a / gcd_ll(a, b) * b; }2. 快速幂long long qpow(long long a, long long b, long long mod) { long long res 1 % mod; a % mod; while (b) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; }3. 判断完全平方数bool isSquare(long long x) { long long r sqrt(x); return r * r x || (r 1) * (r 1) x; }十五、你最该优先背的高频语法这一部分最重要刷题最常用。sqrt(x) abs(x) fabs(x) max(a, b) min(a, b) gcd(a, b) lcm(a, b) floor(x) ceil(x) round(x) sin(x) cos(x) tan(x) atan(x) atan2(y, x) pow(a, b)以及这些固定写法const double PI acos(-1.0); const double eps 1e-9; 1LL * a * b cout fixed setprecision(6);十六、最容易考到也最容易错的点1.pow不适合做整数精确运算例如pow(2, 50)可能有精度误差。2.atan2(y, x)顺序别写反是先y后x。3. 三角函数参数是弧度不是角度4.3 / 2 1如果要1.5必须写3.0 / 25. 浮点数比较别用6. 组合数、阶乘很容易爆long long范围一大就不能直接算。十七、给你一个可直接背的竞赛数学模板#include bits/stdc.h using namespace std; const double PI acos(-1.0); const double eps 1e-9; const long long INFLL 0x3f3f3f3f3f3f3f3f; long long gcd_ll(long long a, long long b) { return b ? gcd_ll(b, a % b) : a; } long long lcm_ll(long long a, long long b) { return a / gcd_ll(a, b) * b; } long long qpow(long long a, long long b, long long mod) { long long res 1 % mod; a % mod; while (b) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; } bool isPrime(long long n) { if (n 2) return false; for (long long i 2; i n / i; i) { if (n % i 0) return false; } return true; } bool isSquare(long long x) { long long r sqrt(x); return r * r x || (r 1) * (r 1) x; } int main() { double x PI; cout fixed setprecision(6) x \n; return 0; }十八、你现阶段建议怎么记你现在不用一次全背先分三层第一层先背sqrtabs/fabsmax/mingcd/lcmfloor/ceil/roundatan21LL * a * bfixed setprecision第二层再背快速幂质数判断筛法组合数第三层再补对数随机数浮点误差处理几何角度换算

更多文章