C++ 竞赛学习笔记

7 阅读2分钟

一、基础运算与输入输出

1. 基础公式
  • 求和:sum = 0
  • 求乘积:sum = 1
  • 交换两个数:swap(a, b)
  • 输入整数:cin >> a
  • 输出整数:printf("%d", a);
2. 判断条件
  • n 能被 i 整除:n % i == 0

  • 偶数:n % 2 == 0

  • 奇数:n % 2 == 1

3. 最值查找
  • 最大值:max = -99999,if(max < ?) max = ?

  • 最小值:min = 999999,if(min > ?) min = ?

4. 循环控制
  • 统计数量:cnt = 0; cnt++;

  • 循环 1~n:for(int i=1; i<=n; i++){}

  • 输入 n 个数:for(int i=1; i<=n; i++){ cin >> x; }

  • 中断循环:break

  • 跳过本轮:continue

二、数组

1. 一维数组
  • 输入 n 个值:for(int i=1; i<=n; i++) cin >> a[i];
  • 倒序输出:for(int i=n-1; i>=0; i--)
2. 二维数组(n*m 矩阵)
for(int i=1; i<=n; i++){ 
   for(int j=1; j<=m; j++){
       cin >> a[i][j]; 
   }
}
  • 主对角线:i == j
  • 副对角线:i + j == n + 1
3. 字符数组 / 字符串
  • 字符数组长度:#include ,strlen(数组名)

  • 字符串长度:#include ,变量名.size()

  • 整行读取:getline(cin, 变量名)

  • 截取子串:s.substr(起始位置, 长度)

  • 查找字符:s.find(字符),未找到返回 string::npos

  • 替换内容:s.replace(起始位置, 长度, 新字符串)

  • 删除字符:s.erase(起始位置, 长度)

  • 插入字符:s.insert(位置, 字符串)

  • 转整数:stoi(s),stoll(s)(long long)

  • 整数转字符串:to_string(数字)

三、排序与库函数

1. 排序
  • 升序:sort(数组名, 数组名+长度); 需 #include

  • 降序:sort(数组名, 数组名+长度, greater());

2. 数学函数(#include )
  • 幂:pow(2, 10)

  • int 绝对值:abs(-5)

  • float 绝对值:fabs(-5.999)

  • 平方根:sqrt(225)

  • 最大/最小:max(25, 6),min(25, 6)

  • 向下取整:floor(5.9)

  • 向上取整:ceil(5.2)

  • 两点距离:sqrt((x2-x1)(x2-x1)+(y2-y1)(y2-y1))

四、STL 容器(#include <bits/stdc++.h>

1. vector 动态数组
  • 定义:vector v;
  • 尾部添加:v.push_back(值);
  • 尾部删除:v.pop_back();
  • 访问元素:v[i] 或 v.at(i)
  • 获取大小:v.size()
  • 清空数组:v.clear()
  • 判空:v.empty()
  • 排序:sort(v.begin(), v.end());
2. map 映射(键值对)
  • 定义:map<string, int> mp;
  • 插入/修改:mp["key"] = value;
  • 访问:mp["key"]
  • 查找键:mp.count("key")(返回0或1)
  • 遍历:
    for(auto &p : mp){
    cout << p.first << " " << p.second << endl;
    }
    
3. set 集合(自动去重+排序)
  • 定义:set s;
  • 插入:s.insert(值);
  • 删除:s.erase(值);
  • 查找:s.count(值)(返回0或1)
  • 获取大小:s.size()
4. pair 二元组
  • 定义:pair<int, int> p = {1, 2};
  • 访问:p.first, p.second
  • 比较:先比first,再比second

五、函数

1. 函数模板
函数类型 函数名(参数1, 参数2...){
return ?; 
}
2. 质数判断
bool isprime(int n){ 
     for(int i=2; i*i<=n; i++){
         if(n%i==0) return false;
      }
       return true; 
}                       
3. 因子和
int yinzi(int n){
    int sum=0;
    for(int i=1; i<n; i++){
        if(n%i==0) sum += i;
    }
    return sum;
}       
4. 斐波那契递推式

f[i] = f[i-1] + f[i-2]; (i>=3)

5. 最大公约数 gcd
int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}