蓝桥杯 / 算法竞赛数学部分常用 C++ 语法速查表
一、基础数学运算
1. 绝对值
abs(x) // 整数绝对值
fabs(x) // 浮点数绝对值
例子:
cout << abs(-7) << '\n'; // 7
cout << fabs(-3.14) << '\n'; // 3.14
2. 最大值、最小值
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); // 5
2. 幂函数
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) // -4
2. 向上取整
ceil(x)
例子:
ceil(3.1) // 4
ceil(-3.1) // -3
3. 四舍五入
round(x)
例子:
round(3.6) // 4
round(3.4) // 3
4. 正数四舍五入常见写法
(long long)(x + 0.5)
只适合 x >= 0。
四、三角函数与几何常用
1. 三角函数
sin(x)
cos(x)
tan(x)
注意:参数必须是弧度。
2. 反三角函数
asin(x)
acos(x)
atan(x)
3. 求极角最重要:atan2
atan2(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 = 2
2. 取模
a % b
例子:
7 % 3 = 1
3. 保证模结果非负
((a % mod) + mod) % mod
这个在数论题里很常见。
六、最大公约数、最小公倍数
1. gcd
gcd(a, b)
C++17 可直接用。
2. lcm
lcm(a, b)
或者手写:
a / gcd(a, b) * b
注意先除后乘,防止溢出。
3. 手写 gcd
long 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 <iomanip>
2. 浮点数判等
不要直接写:
if (a == b)
应该写:
const double eps = 1e-9;
if (fabs(a - b) < eps)
3. 判断大小
if (a < b - eps)
if (a > b + eps)
十一、常见位运算里的数学用法
1. 判断奇偶
x & 1
2. 除以 2
x >> 1
3. 乘以 2
x << 1
4. 判断第 k 位是不是 1
(x >> k) & 1
十二、竞赛里很常见的"防溢出写法"
1. 乘法转 long long
1LL * 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_distribution<int> dist(1, 100);
cout << dist(rng) << '\n';
十四、常见数学模板
1. gcd + lcm
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;
}
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 / 2
5. 浮点数比较别用 ==
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;
}
十八、你现阶段建议怎么记
你现在不用一次全背,先分三层:
第一层先背:
-
sqrt -
abs/fabs -
max/min -
gcd/lcm -
floor/ceil/round -
atan2 -
1LL * a * b -
fixed << setprecision
第二层再背:
-
快速幂
-
质数判断
-
筛法
-
组合数
第三层再补:
-
对数
-
随机数
-
浮点误差处理
-
几何角度换算