我的 C++ 代码规范¶
以 UOJ22 外星人一题的代码为例
#include <bits/stdc++.h>
typedef long long int ll;
const int maxn = 1e3 + 19, maxv = 5e3 + 19, mod = 998244353;
int n, x, a[maxn], dp[maxn][maxv];
bool ok[maxv], tmp[maxv];
int solve(int y){
dp[0][y] = 1;
for(int i = 1; i <= n; ++i)
for(int j = 0; j <= x; ++j)
dp[i][j] = (dp[i - 1][j % a[i]] + (ll)dp[i - 1][j] * (i - 1)) % mod;
return dp[n][x];
}
int main(){
std::scanf("%d%d", &n, &x);
for(int i = 1; i <= n; ++i)
std::scanf("%d", a + i);
std::sort(a + 1, a + 1 + n);
ok[x] = true;
for(int i = n; i >= 1; --i){
for(int j = 0; j <= x; ++j)
if(ok[j])
tmp[j % a[i]] = true, tmp[j] = true;
std::copy(tmp, tmp + x + 1, ok);
std::fill(tmp, tmp + x + 1, false);
}
for(int i = a[1] - 1; i >= 0; --i)
if(ok[i]){
std::printf("%d\n%d\n", i, solve(i));
return 0;
}
return 0;
}
- 为了方便,使用
bits/stdc++.h
作为头文件。 - 如果需要使用 64 位整数或 64 位无符号整数,则使用
typedef
定义别名为ll
和ull
。 - 为了美观,使用制表符缩进。
- 数组大小用常量定义,模数也为常量。
- 为了防止从 1 开始标号导致的越界,数组大小为其最大值加上 19。19 是一个幸运数字。
- 可以用前缀自加替换时,不使用后缀自加。
- 绝对不使用
using namespace std
。 - 大括号紧跟函数声明,不用空格或是换行分隔。
- 即使是来自于 C 库的函数,也要使用
std::
解析作用域。 - 除非特殊情况,不使用流输入输出。
- 除了
(
、)
、!
和前后缀自加等运算符,所有变量和运算符之间都有一个空格。 - 用
true
和false
来直接向bool
类型赋值,而非1
和0
。 - 不使用
std::memset
或std::memcpy
,而使用std::fill
和std::copy
。 - 为了锻炼对复杂代码的适应能力,尽量不使用 C++ 11 的内容。
- 各个模块尽量分为一个个函数。较简单的模块可以不写为函数,但要用一个空行与其他模块分隔。
- 为了代码美观,不使用宏定义。唯一可以使用宏定义的地方是线段树
#define ls (node << 1)
和#define rs (node << 1 | 1)
。(在极特殊情况下也允许#define int long long
) - 不使用
class
。 - 各个数据结构和可以自然地视作单个对象的结构,在不影响效率的情况下用
struct
进行适度的封装。 - 当函数参数为空时,参数声明应为
void
;主函数可以不加void
声明。 - 有符号整数不与无符号整数直接比较。要视情况对其中一个强制转换后比较。
- 即使可以提前得出答案,也要将数据全部读入。