常见基础错误
手(shou)误(jian)
- 出错特征:程序执行流程出乎意料,结果不正确。
- 出错样例:
for (int i = 0; i < n; i++) {
if (i = n) printf("%d\n", i);
else printf("%d ", i);
}
memset(a,0,sizeof(0))
for(int i = 0,i < n; i++){
for(int j= 0; j < m; i++)
}
- 治疗方法:剁手。多剁两次就记住了。
眼瞎系列
- 出错特征:大小写字母傻傻分不清楚,该注释不注释,不该注释注释
- 出错样例:
puts("yes"); // YES / Yes
#ifdef AC
freopen("data.txt"."r",stdin);
#endif
//网络赛队友把我的代码copy下来debug,然后本地并没有设置编译参数,于是跑不出结果
//2.0:然后把#ifdef删掉:
freopen("data.txt"."r",stdin);
//本地测试没问题,交上去WA
- 治疗方法:戳眼。多戳两次就记住了。
缩代码
- 出错特征:为了缩行或者简化代码暂(S)时(B)的忽略了语法导致WA
- 出错样例:
if(x==0){
if(y==0)f1();
}
else f2();
//为了缩代码,改成下面这样:
if(x==0)
if(y==0)f1();
else f2();
if(x%2==0) ...;
//同上
if(x&1==0) ...;
- 治疗方法:让队友揍你。多揍几次就记住了。
浮点数
- 出错特征:忽略了浮点数的精度误差问题导致WA或者TLE
- 出错样例:
double a = 1/3*3;
double b = 1;
if (a == b) {
printf("Yes");
}
double l=1.0,r=100.0;
while(l<=r){
double mid=(l+r)>>1;
if(ok(mid))l=mid;
else r=mid;
}
- 治疗方法:使用eps
- 注意点:eps到底取多少? 一般在1e-5到1e-8之间。有些题目卡eps。
初始化
- 出错特征:WA
出错样例:比如每次使用vis之前没有清false之类
治疗方案
每个变量定义的同时就初始化。
提交代码之前,检查所有定义的变量是否已经初始化。
数组大小
- 出错特征:差别不大的会WA或TE。差别大的会RE。
- 出错样例:眼花手抖导致的数组少个0。,“树”类问题数组只开了n
- 治疗方案:数组开的足够大。
复制代码
- 出错特征:复制一段代码然后粘贴再修改的方式编程。常常出现没修改干净的问题。常出现在搜索题或输出图形的题。
- 出错样例:
void dfs1(int i){ xxxxx dfs1(x);}
//很好,我们复制粘贴一下,改一下函数名
void dfs2(int i){ xxxxx dfs1(x);}
//瓜皮代码都能过样例 千万不能相信样例!
- 治疗方案:
- 不要复制代码。把能重用的地方封装成函数然后再用(往往比较费时间)
- 采用复制代码方式。修改后然后检查3遍,当WA的时候,重点检查此处。优先重写此处。(即将复制的代码列为高危代码)
写在最后
如果各位刷题时出现闹鬼代码,欢迎编辑在此,以供后人抓鬼。