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

蓝桥杯 / 算法竞赛数学部分常用 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

如果 ab 都是整数,那么结果仍是整数。

复制代码
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

第二层再背:

  • 快速幂

  • 质数判断

  • 筛法

  • 组合数

第三层再补:

  • 对数

  • 随机数

  • 浮点误差处理

  • 几何角度换算


相关推荐
想唱rap2 小时前
线程池以及读写问题
服务器·数据库·c++·mysql·ubuntu
香蕉鼠片2 小时前
数据结构八股(一)
数据结构·算法
Mr_Xuhhh2 小时前
从理论到实践:深入理解算法的时间与空间复杂度
java·开发语言·算法
望眼欲穿的程序猿3 小时前
Vscode Clangd 无法索引 C++17 或者以上标准
java·c++·vscode
Lenyiin3 小时前
《Python 修炼全景指南:一》从环境搭建到第一个程序
开发语言·python
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 42. 接雨水 | C++ 动态规划与双指针题解
c++·算法·leetcode
地平线开发者3 小时前
智能驾驶感知算法的演进
算法·自动驾驶
涛声依旧393163 小时前
Python项目实战:学生信息管理系统
开发语言·python·数据挖掘
爱丽_3 小时前
B+ 树范围查询为什么快:页分裂/合并、索引设计与 SQL 写法优化
数据库·算法·哈希算法