一如既往的每周OJ两题时间,不过这一周有点不太愉快。

题面就不贴出来了,不过是一个数值范围在1e18以内,需要同时用到取对数和求幂的题。

用了常规的写法,CPP直接用了cmath库里的**log()pow()**方法来求值。发现前五个数值范围在1e6内的成功AC,但是后五个1e18的就挂掉了。

于是全局int改用long long,**log()也改成了log10()**,问题依旧。

从晚上十一点反复改到凌晨四点,加上强制类型转换依旧无果,最终心态崩了。昨天一整个白天我都没上线,原因就在这(哭到天亮,然后睡了个不省人事)。

后来痛定思痛,把所有除了取对数以外涉及到浮点数的都手写成了整型模式,终于过了。罪魁祸首也终于浮出水面:**pow()**。

cmath库里,**pow()**是基于浮点数运算的,返回值转回int时必然会有精度损失。

尝试在OJ上复现,但是因为自己想到的数字太小都没成成功,而且因为黑箱我也看不到输出结果。

查了一圈,最后在CSDN上发现了类似的情形:链接

最后得出了惨痛教训:整型慎用**pow()**。

实际上是慎用强制转换

从此,我的轮子库里又多了一个用long long重写的**pow()**方法。