常见错误总结

少打头文件

少打using namespace std;

命名冲突,全局变量与局部变量命名一致,导致使用的值不是期望值

边读边写,导致改后读,覆盖写入的值

长整数移位溢出,1<<63是错误的,应该写成1ll<<63

循环变量打错,i打成j  犯错次数加一

乘法溢出导致的,数组下标正溢出或负溢出

dfs时,开头没有vis[start]=1;

bfs时,状态维数开少

bfs时,少写了vis[node]=1或者少写了Q.pop导致的MLE

解同余方程时,不先约去GCD的话,解的距离就是a/GCD或b/GCD,先约了的话,那么需要原方程的值的时候就需要带入a,而不是已经改变的a/GCD

做exgcd的题目一定要小心ans%mod==0的情况

(N-ans)/y+1 如果ans==0,则1不应该加

公式不能只考虑第一个元素,其他元素也要全部列出来

单调队列总是忘了取元素,直接把队列中的下标拿出来用

vector的resize不会释放内存,之前的值都还在...

二重循环里容易把=写成+=

 INF值不够大

char数组放了过大的值

char数组结尾不是'\0'

当要改变一系列声明变量的类型时。。。如果不小心在回车换行时,把大数据类型改成了小数据类型,则会发生溢出。或者ub

比如int-->bool 结果不断加一他还是一

 

然后就是下标i,j容易弄混,在内循环容易仍然使用i,或者使用常量

 

然后平常容易逻辑写反比如while(a!=NULL&&b!=NULL)和while(!a&&!b)这两个看起来很像,但是逻辑上是相反的

 

然后就是编程范式。。。也叫循环不变式,这个一定要想好,是最前面初始化推最后,还是先计算最后考虑结尾

 

 数组名称写错,传的参数一直不变,或者临时参数一直没有还原

 

不能整除导致的加一和(int)(divison expr+0.5)是不一样的。。。。

 

还有一道雪崩的大数题目:http://www.cnblogs.com/linkzijun/p/6106697.html

 

https://www.jisuanke.com/article/po3pm3e6

 下面调试程序的技巧转自计蒜客

作者介绍:计蒜客研发工程师,毕业于西南科技大学,曾获 ACM/ICPC 亚洲区预赛金奖。

代码能力是我们在程序设计竞赛中常常谈到的一种能力,是指选手把算法用代码准确地实现的能力。

2005 年,Comars 曾经给代码能力作过一个比较准确的定义:如果我 150150 行以内的题目,1Y(提交一次就正确通过,Y 是指 Yes)率非常高,并且保持稳定;而当代码长度超过 150150 行以后,1Y 率就开始急速下降了。如果我们画出一条代码行数与 1Y 率之间的关系的曲线,150150 行就是一个转折点。我们不妨认为,150150 行就是 Comars 当时的代码能力。一年以后,经过努力,Comars 把代码能力提高到了 250250 行,也就意味着他通常可以无错误地写出一份 250250 行的代码。

当然,想要把代码能力提高到 150150 行并非是一个简单的事情。在代码能力不够强的时候,就需要有足够的调试(debug)能力了。结合我的比赛经历和平时训练的经验,给大家分享一些程序设计竞赛题目 debug 的技巧。

在开始 debug 之前,要先在脑海中过一遍思路,必须保证自己有一个清晰的算法思路和一个正确的算法(至少自己要相信它是正确的)。一定要有清晰的思路,不然写出来的代码可能连自己都看不懂;而基于一个错误算法的 debug 是毫无意义的。当你确认了上面两件事情以后,才有必要开始 debug。

1) 顺着你的思路仔细阅读自己的代码两到三遍,注意是仔细,要一句一句地读。核对你的代码和你的思路是否一致,不要放过任何一个小细节。如果遇到拿不准的地方,立刻停下来仔细想想,直到想清楚以后再继续。在这个过程中,往往可以找到很多低级错误,尤其是对于代码能力不太好的同学,比如——变量打错、代码写错位置、变量赋值错误等等。静态阅读代码的效率是非常高的,因为往往读一份自己写出的代码的时间远小于写的时间——既然都已经花了那么多时间写出来了,何必还在乎这点时间多读几遍呢。

2) 如果经过上面的过程还没有找到程序中的错误,或者找到了一些问题但是程序的结果还是不对,这时我们就要通过运行程序来 debug。根据我以往参加竞赛的经验,经过上面的过程基本上可以解决一半以上的问题。如果一定要走到这一步,很可能已经给自己挖了一个巨大的坑。想要通过运行程序来 debug,第一步是需要拿到一组能使得程序出错的数据,拿到错误数据以后,debug 就成功了一半。在造错误数据时,一定要静下心来耐心出,不要指望一下就能造出错误数据。并且造出的数据尽量不要规模太小、太简单,数据越复杂,找到错误的概率会越高。对于 ACM/ICPC 这种团队比赛,必要的时候你可以让队友帮你造数据。例如某年 ACM/ICPC 沈阳赛区,我当时调试一道模拟题半个多小时还是错的,距离比赛结束还有 1010 分钟时,队友找到一组错误数据,然后我调了 55 分钟就找出了那个致命的 bug。在比赛进行到 295295 分钟(比赛一共 300300 分钟)的时候正确通过了这题(很关键的一题)。同年上海赛区,也是最后几分钟队友给出一组给力数据,在 299299 分钟绝杀一道 dp 题目。有了数据以后,剩下的调试应该很简单了。根据错误数据,输出一些重要的中间变量的值,然后观察是否和预期一样。这里也可以借助二分思想输出中间变量,快速定位到错误代码块。不过实践中,通常是根据经验,觉得哪块容易出错就重点输出哪一块的变量。无论是平时训练还是比赛中我都建议少用 IDE 断点调试功能和单步调试功能,通常比较浪费时间。

3) 对于某些特殊题目,小数据可以很容易写出一个时间效率低但确保正确的“暴力”程序。这时候,我们可以用暴力程序和出错程序对拍。对于造出的一些小数据,同时用自己的程序和暴力程序得出答案然后对比。这个小数据的范围是暴力程序能在短时间内得到正确结果的最大范围。因为暴力程序一般都很简单,没那么容易写错,所以你通常把暴力程序当成小数据的标准程序。如果连暴力都写错,建议多做练习,提高代码能力,确保短代码都能尽量做到零失误。

经过上面的 debug 过程以后,如果你手造的复杂数据多达 1010 组以上还没有发现错误。你可以尝试下面的做法:

  1. 重新思考一个新思路,或者尝试去发现原思路中的问题。

  2. 先静下心来,先看看其他题,AC 一些其他题调整一下状态,然后回来重新 debug。

  3. 如果你确定思路一定没问题,代码也一定没错,那通常是因为你读错题目了,重新回去读题。

  4. 如果到这一步你的程序还是无法正确通过,并且你确保没读错题,只要有足够的自信,联系出题人,和他确认数据是否有问题。

debug 过程中不要轻易请教别人,请教别人思路没问题,但是请教别人帮你 debug 不太好。除非你已经连续 debug 了一天还没有发现错误,再考虑去请教其他人。这里教大家一个 debug 技巧——断言(assert)。

1
assert(x >= 0);

如果x >= 0不成立,则程序会因为运行错误而退出。比如写一个整数除法函数:

1
int division(int x, int y) {
2
    assert(y != 0);
3
    return x / y;
4
}

如果y == 0程序就会异常退出,你一定是在程序的其他什么地方写错了。

再如,solve(x, y)如果应该等于solve(y, x),我们可以assert(solve(x, y) == solve(y, x)),如果运行错误,那么必然solve写错了。在解决 Polya 计数题目的时候,可以assert(sum % |G| == 0)。除了用来调试以外,assert还可以用来验证数据是否规范,对出题人很方便,还可以用来验证 OJ 数据的准确性。

经验之谈

最后列出一些比赛和训练中特别容易犯的一些低级错误和治疗方法:

  1. 错误代码

    1
     int n;
    2
     int a[n];

    治疗方法:初学者很容易写出这样的代码,当然老队员肯定写不出这种代码的。尽量避免这种写法,定义数组用常量,比题目约定的数据范围稍微大一点。比如数据范围是 1 \leq n \leq 100001n10000,则开一个 10000 + 1010000+10 的数组会比较稳妥,因为你也许后来心血来潮让下标从 11 开始计数。

    1
     const int maxn = 10000 + 10;
    2
     int a[maxn];
  2. 错误代码

    1
     for (int i = 0; i < n; i++) {
    2
         if (i = n) {
    3
             printf("%d\n", i);
    4
         }
    5
         else {
    6
             printf("%d ", i);
    7
         }
    8
     }

    治疗方法:剁手。编译警告(warning)会提醒的,不要忽略甚至直接关闭编译警告。建议在做题的时候把编译选项-Wall打开:

    1
     g++ -Wall -o main main.cpp
  3. 错误代码

    1
     double a = 1 / 3 * 3;
    2
     double b = 1;
    3
     if (a == b) {
    4
         printf("Yes");
    5
     }

    治疗方法:判断浮点数相等应该用极小值eps来辅助,一般eps1e-8足够了,确保比题目约定的精度误差要求更小。

    1
     const double eps = 1e-8;
    2
     double a = 1 / 3 * 3;
    3
     double b = 1;
    4
     if (fabs(a - b) < eps) {
    5
         printf("Yes");
    6
     }
  4. 错误代码

    1
     const int inf = 0x7fffffff;
    2
     int dp[10];
    3
     int main() {
    4
         for (int i = 0; i < 10; ++i) {
    5
             dp[i] = inf;
    6
         }
    7
         for (int i = 1; i < 10; ++i) {
    8
             dp[i] = min(dp[i], dp[i] + dp[i - 1]);
    9
         }
    10
         return 0;
    11
     }

    治疗方法:这里inf + inf会溢出,超出了int的范围。可以把inf的定义改成:const int inf = 0x3fffffff,就可以确保不会溢出了。顺便给大家推荐一个小技巧:

    1
     int dist[100];
    2
     memset(dist, 0x3f, sizeof(dist));

    如上的代码可以让dist数组中的所有元素赋值为0x3f3f3f3f,并且两个初始值相加也不会溢出,常用于图论或动态规划中数组的初始化。

  5. 错误代码

    1
     // 1. 线段树 build
    2
     void build(int id, int l, int r) {
    3
         if (l == r) {
    4
             return;
    5
         }
    6
         int mid = (l + r) >> 1;
    7
         build(id << 1, l, mid);
    8
         build(id << 1 + 1, mid + 1, r);
    9
     }
    10
     // 2. 取 dp 答案
    11
     printf("%d\n", dp[1 << n - 1]);

    治疗方法:没有弄清楚操作符优先级。在优先级不确定的情况下,用小括号来明确指定优先级能够避免这类问题的发生。当然,最好还是要弄清这些符号之间优先级的关系。

    1
     // 1. 线段树 build
    2
     void build(int id, int l, int r) {
    3
         if (l == r) {
    4
             return;
    5
         }
    6
         int mid = (l + r) >> 1;
    7
         build(id << 1, l, mid);
    8
         build(id << 1 | 1, mid + 1, r);
    9
     }
    10
     // 2. 取 dp 答案
    11
     printf("%d\n", dp[(1 << n) - 1]);
  6. 错误代码

    1
     #define MAXN 1000 + 10
    2
     #define MULTIPLY(x, y) x * y
    3
     int a[MAXN * 4];
    4
     int main() {
    5
         int x = MULTIPLY(1 + 2, 3);
    6
         return 0;
    7
     }

    治疗方法:尽量不要用宏定义,常量用const来定义。宏定义虽然很方便,但是用起来很容易出错,比如上面这段代码。如果你一定要用宏定义,先去了解宏定义常见的“坑”再用。

  7. 错误代码

    1
     #include <iostream>
    2
     using namespace std;
    3
     bool t, first;
    4
    5
     int main() {
    6
         first = true;
    7
         cin >> t;
    8
         while (t--) {
    9
             ...
    10
         }
    11
         return 0;
    12
     }

    治疗方法:写代码的时候不要太“随性”,这种情况的发生通常都是写程序时中途加了一个变量导致的,只要不太粗心就能避免。由于可能会发生这类错误,所以在本地造数据的时候,对于多组数据的题目要尽可能在一次测试中多造几组数据,以尽量避免此类问题。

  8. 在大多数平台和 ACM/ICPC 现场赛时,C++ 的 long long 用%lld输入;而对于一些搭建在 Windows 上的 OJ(如 Codeforces、HDOJ),要用%I64d读入。具体使用哪个占位符要多看 FAQ。

  9. 变量在访问前一定要初始化。好的习惯是在定义一个变量的时候就立刻初始化。一定注意,很多平台(包括计蒜客的题库)的编译器是不会在定义数组后将数组内元素全部初始化为 00 的,如果你遇到本地和线上结果不一致的情况,可以从这个方向来找问题。

  10. 避免访问非法内存。访问非法内存的事情经常发生,但是可以通过养成好习惯来避免。比如stackqueueset访问之前必须先确认不为空;访问指针之前确保指针不是野指针;数组内存开得足够大,等等。

转载于:https://www.cnblogs.com/linkzijun/p/6783103.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HALCON相机标定相机内参相机外参

目录相机标定1.相机标定是什么2.怎么使用halcon进行相机内外参标定&#xff1f;&#xff08;1&#xff09;搭建硬件1.**相机连好电脑&#xff0c;用相机厂家软件打开相机&#xff0c;检查一下相机是否正常。**2.**接下来使用halcon连接相机**&#xff08;2&#xff09;开始标定…

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);会改变url中 &#xff1f; 后面的 搜索参数&#xff0c;但是controller不会重新实例化。angular 官方文档…

C#圆形卡尺测量程序基于halcon

废话不多说上源码 觉得帖子有用给点个赞哈 先来个效果图 下边的是源码&#xff0c;自己新建一个文件粘贴进去&#xff0c;包含到您现在的项目 中。这串源码后边是使用方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

科维PLC运行时系统ProConOS embedded CLR 2.2 特定应用

ProConOS embedded CLR是新型的开放式标准化PLC运行时系统&#xff0c;符合IEC 61131标准&#xff0c;可执行不同的自动化任务&#xff08;PLC、PAC、运动控制、CNC、机器人和传感器&#xff09;。   通过采用国际标准的微软中间语言&#xff08;依据IEC/ISO 23271标准为MSIL…

set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get()&#xff0c;同事问了我一些问题&#xff0c;我打算在博客中总结一下。 觉得帮助到了您&#xff0c;帮我点个赞哦。 属性访问器 其实说白了就是操作一个属性&#xff0c;更通俗一点说就是对一个变量的取值与赋值。 先来看get() get 访问…

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题&#xff0c;想了一个解决办法。 我们首先作假设&#xff0c;如果一条曲线有交点&#xff0c;那么它就是相交的对吧。可能大家想的都是这样&#xff0c;就开始找各种方法去识别交点。 我们换个角度想一下&#xff1a;是不是我们判断这条曲线是否带…

hdu 5813 Elegant Construction

水题 题意&#xff1a;有n个城市&#xff0c;给你每个城市能到达城市的数量&#xff0c;要你构图&#xff0c;输出有向边&#xff0c;要求无环&#xff0c;输出任意的解 例&#xff1a; Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

halcon相机标定及图像矫正(代码)

侵删 1 halcon相机标定和图像矫正 对于相机采集的图片&#xff0c;会由于相机本身和透镜的影响产生形变&#xff0c;通常需要对相机进行标定&#xff0c;获取相机的内参或内外参&#xff0c;然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变&#xff0c;其中径向畸变是由透…

函数参数的传递问题(一级指针和二级指针)

函数参数的传递问题&#xff08;一级指针和二级指针&#xff09; [转]原以为自己对指针掌握了&#xff0c;却还是对这个问题不太明白。请教&#xff01; 程序1&#xff1a; void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程 Ubuntu&#xff08;友帮拓、优般图、乌班图&#xff09;是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;Ubuntu 是基于DebianGNU/Linux&#xff0c;支持x86、amd64&#xff08;即x64&#xff09;和ppc架构&#xf…

CoDeSys的前世今生

&#xfeff;&#xfeff;工作以及网上看到不少人说&#xff0c;CoDeSys和西门子step7&#xff0c;在德国都属于标准过程&#xff0c;牛逼的小朋友都可以用其编程&#xff0c;不知真假&#xff0c;相信无风不起浪&#xff0c;多少有些依据&#xff0c;看看国內清一色的日系编程…

Eclipse中执行Ant脚本出现Could not find the main class的问题及解

试过了&#xff1a;https://blog.csdn.net/bookroader/article/details/2300337 但是不管用&#xff0c;偶然看到这篇没有直接关系的 https://blog.csdn.net/jiuyueguang/article/details/9350753 联想了一下。项目是JDK1.5&#xff0c;Eclipse是JDK1.8启动&#xff0c;所以在R…

视频通话研究002

还是关于视频质量。经測试&#xff0c;在公网server使用SQCIF(128x98)进行视频通话。2个client都是这个设置&#xff0c;感觉不出马赛克&#xff0c;模糊严重&#xff0c;在一个手机client抓包&#xff0c;例如以下&#xff1a; 第1,2行是client发到server的数据&#xff1b;第…

实力打脸: 量子隐形传输与 “瞬间移动” 毫无关系

有两个团队已经在量子隐形传输研究领域创造了新的传输记录&#xff1a;利用深不可测的量子力学知识将一个粒子的量子态迅速从一个位置迁移到另一个位置的粒子上。其中一个团队采用这种方法&#xff0c;运用一种光学纤维将一个光子的量子态穿越加拿大西南部的一个城市&#xff0…

Android初级教程:使用xml序列器

之前备份短信的时候生成xml都是手动拼写的&#xff0c;有一个问题&#xff1a;当短信里面存在</body>这样的标签的时候&#xff0c;最后结果就不是完整的xml文件&#xff0c;显然出错。但是&#xff0c;今天使用序列化器的方式&#xff0c;就能有效的解决上边遇到的问题。…

KUKA 声明变量时的几点注意

临时变量&#xff1a; 1、src文件中定义的局部变量&#xff0c;该种变量存在于内存中的栈上。子程序调用时&#xff0c;变量在栈上动态生成。调用结束后从栈中自动销毁。 因为存在于栈上的原因&#xff0c;访问该变量需要栈指针&#xff0c;所以该种变量无法在机器人程序运行时…

简单实现

1.创建接口和实现类 &#xff08;模拟实现查询天气&#xff09; 接口&#xff1a; package com.learning.weather;/*** * weather 接口 &#xff1a;实现模拟wsdl*/ public interface WeatherInterface {/*** 查询天气* param name* return*/public String queryWeather(Strin…

有关莫比乌斯反演

对于两个定义域为整数的函数F(x)和f(x); 若有: 然后F(x)可以快速求出&#xff1b; 如何用F求解f呢&#xff1f; 莫比乌斯反演&#xff1a; 对于两个定义域为整数的函数F(x)和f(x); 若有: 则有&#xff1a; 其中μ(x)为莫比乌斯函数&#xff0c;其定义为&#xff1a; 对于&#…

(原创)JS点击事件——Uncaught TypeError: Cannot set property 'onclick' of null

html部分代码&#xff1a; JS部分代码&#xff1a; 需要实现的效果&#xff1a;点击图片&#xff0c;来回相互切换。 我开始的错误做法&#xff1a;代码如上图所示&#xff08;逻辑上看起来是没有错误的&#xff09; 尝试过程&#xff1a;把JS代码放在</body>闭合标签之前…

事务传播机制/数据库异常解析——2016-8-13分享总结

一. 事务的传播机制&#xff0f;required 跟 required new 的使用与区别 基础回顾 1.1 事务的隔离级别&#xff1a; ISOLATION_READ_UNCOMMITTED&#xff08;读未提交&#xff09; ISOLATION_READ_COMMITTED&#xff08;读已提交&#xff09; ISOLATION_REPEATABLE_READ&#x…