Blog 2
讲一些最近在写代码过程中容易错且自己不太容易发现的错误吧。 1. 数值定义上,int型和long long型。如果int定义m=10^7,而m会有n=10^3的类似数据累加,就会溢出,导致Wrong Answer。所以要看题目到底是定义成int还是long long,有时候不太确定的或者在边缘附近的,就简单地定义成long long好了。 2. Runtime Error。数组越界,包括定义时开的太小,在函数中赋值的时候超过了下标范围或是在函数中赋值时数组下标到达了负数或超出范围;也有可能是除0问题,一般除数可能为零的话,那种情况需要单独讨论。 3.强制类型转换,注意写法和类型的位置。有向下取整函数floor和向上取整函数ceil,头文件是<cmath>。
比如PO就1604 的那题Cable Master 的输出,正确的应该是 printf ("%.2lf\n" ,(double )(int )(ed*100 )/100 );,或者用floor,
printf ("%.2lf\n" ,floor (ed*100 )/100 );,而当时一直是这样的输出:printf ("%.2lf\n" ,(double )((int )(ed*100 )/100 )); WA了很多次,却一直在找其他
地方的错误,根本没意识到是输出的问题。 4.二分的时候注意初始时头,尾的赋值。若赋值不当会导致范围内的某些值(尤其是边缘值)取不到而Wrong Answer。 5. 二分时有小数位精度要注意eps取值合适,太小会导致TLE甚至死循环;太大则精度不准。 另外例如%.4f类的取位是四舍五入,而不是尾数截留。 6.在编译时通过,而在运行时输入数据后崩溃,如果在scanf时的取地址符号&没有忘加的话,可能是数组越界,特别是在方向搜索的时候,某点加上方向坐标后下标值会不会是负数。