最近在看《算法竞赛入门经典》,书中提到循环的两大常见问题,并提出一些建议。
第一是算术运算溢出的问题,尤其是n很大而且都是做的乘法的时候。最常见的现象是输出负值,每步printf也能观察到。如果换数据类型仍解决不了的话,可能得改算法了。
书中的例子是对最终的取余%运算作转化。“要计算只包含加法/减法和乘法的整数表达式除以n的余数,可以在每步计算之后对n取余,结果不变。”即把最后一步取模改为循环中每步取模。
循环容易出现第二个问题是效率低下,runtime error。可以巧用计时函数进行观察:
printf("%.2f",(double)clock()/CLOCKS_PER_SEC);
(用的时候要#include <time.h>;double不能去掉,否则出错。)
可以观察运行时间和n的关系,进而修改或优化算法(不是那么容易解决的)。