调代码时需注意可能存在的naive错误

Chinshyo

2022-08-13 23:28:27

Personal

上一次更新:2022/8/15 ------- 这里收集了本菜鸡日常写代码出的常见问题。考前可以参考,为考场调程序作准备。 ## 下标顺手写成i ### Wrong Code ```cpp while(i < s.size()) { string tmp; for(int j = i; j < s.size(); j++) { if(s[i] >= '0' && s[i] <= '9') tmp = s.substr(i, j - i); i = j; break; } cout << tmp << endl; } ``` ### Correct Code `s[i]`改为`s[j]` ## 指针调用函数没加括号 ### Wrong Code ```cpp void upd(node *s1, node s2, node s3) { int mid = ((*s1).l + (*s1).r) / 2; *s1.sum = s2.sum + s3.sum; *s1.lmax = max(st[lcd].lmax, st[lcd].sum + st[rcd].lmax); *s1.rmax = max(st[rcd].rmax, st[rcd].sum + st[lcd].rmax); *s1.rmax = max(st[lcd].dat, max(st[rcd].dat, st[lcd].rmax + st[rcd].lmax)); } ``` 这里`*`的优先级比`.`的优先级低 ### Correct Code #### Solution 1 ```cpp void upd(node *s1, node s2, node s3) { int mid = ((*s1).l + (*s1).r) / 2; (*s1).sum = s2.sum + s3.sum; (*s1).lmax = max(st[lcd].lmax, st[lcd].sum + st[rcd].lmax); (*s1).rmax = max(st[rcd].rmax, st[rcd].sum + st[lcd].rmax); (*s1).rmax = max(st[lcd].dat, max(st[rcd].dat, st[lcd].rmax + st[rcd].lmax)); } ``` #### Solution 2 ```cpp void upd(node *s1, node s2, node s3) { int mid = ((*s1).l + (*s1).r) / 2; *s1->sum = s2.sum + s3.sum; *s1->lmax = max(st[lcd].lmax, st[lcd].sum + st[rcd].lmax); *s1->rmax = max(st[rcd].rmax, st[rcd].sum + st[lcd].rmax); *s1->rmax = max(st[lcd].dat, max(st[rcd].dat, st[lcd].rmax + st[rcd].lmax)); } ``` ## printf手残加了& ### Wrong Code ```cpp printf(%d, &ans); ``` ### Correct Code ```cpp printf(%d, ans); ``` ## 浮点数误差 C++中浮点运算是存在误差的。如果是整数运算,能避免使用浮点运算尽量避免。 下面这个例子是对于除法的上取整。 $ceil$ 函数对象是浮点数。 ```cpp num = ceil(n / s); ``` 应尽量改为: ```cpp num = (n - 1) / s + 1; ``` 这个公式的正确性可以尝试代奇数和偶数进去试验。 --- **未完待续** ~~怎么可能只有这点~~