01-基础语法/09-常见小技巧

来自三三百科
->Importer2026年5月20日 (三) 16:22的版本 (批量导入三三文档)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

交换两个变量的值

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 的好处:乘以 [math]\displaystyle{ 2 }[/math] 不会爆 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字节赋值,所以只能用于 [math]\displaystyle{ 0 }[/math][math]\displaystyle{ -1 }[/math]0x3f 等每字节相同的值。

防止爆 int

- 计算过程中随时注意结果是否会超过 [math]\displaystyle{ 2\times 10^9 }[/math] - 使用 1LL * a * b 进行 long long 乘法 - 在需要的地方使用 #define int long long

调试小技巧

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

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

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