常见小技巧

分类: 基础语法 · 更新时间 2026-5-27 21:40:57

交换两个变量的值

swap(a, b);

最大公因数与最小公倍数

比赛时允许使用 C++ 自带的 __gcd(a, b) 函数求最大公因数。

手写版本:

int gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
int lcm(int a, int b)
{
    return a / gcd(a, b) * b;
}

数组大小计算

int a[100];
int n = sizeof(a) / sizeof(a[0]); // n = 100

常见常量定义

const int MOD = 1000000007; // 常用模数
const int INF = 0x3f3f3f3f; // 常用无穷大
const long long INFLL = 0x3f3f3f3f3f3f3f3f; // long long 无穷大

0x3f3f3f3f 的好处:乘以 22 不会爆 int,且 memset(a, 0x3f, sizeof(a)) 可以直接把每个元素初始化为它。

memset 初始化数组

#include <cstring>
int a[100];
memset(a, 0, sizeof(a));     // 全部初始化为 0
memset(a, -1, sizeof(a));    // 全部初始化为 -1
memset(a, 0x3f, sizeof(a));  // 全部初始化为 INF

注意:memset字节赋值,所以只能用于 001-10x3f 等每字节相同的值。

防止爆 int

  • 计算过程中随时注意结果是否会超过 2×1092\times 10^9
  • 使用 1LL * a * b 进行 long long 乘法
  • 在需要的地方使用 #define int long long

调试小技巧

// 在代码中使用 cerr 输出调试信息(不会影响 OJ 评判)
cerr << "debug: a = " << a << "";

// 输出当前行号
cerr << __LINE__ << "";

// 可以用 if 包裹,方便最后一起删除
if (false)
    cerr << "debug: " << x << "";