我在TopCoder中编码问题。在一个计算步骤中,可能会出现溢出,分析表明解决方案投放时间过长。我不明白为什么这行得通。

int normalize(int pos) {
    return (int) (((long) pos % MODULO + MODULO) % MODULO);
}

变量posMODULO都可以在-2147483648和2147483647范围内
我想知道投放很长的时间有什么帮助?谢谢!

最佳答案

在Java中,long始终为64位。当用两个不同宽度的量执行算术运算时,Java的规范说该算术运算是使用较大的数据类型完成的。

因此,通过将pos转换为long,所有后续算术都是使用64位long s完成的。由于最后一步是针对32位值进行mod运算,因此结果肯定可以容纳在32位之内,因此最终的强制转换不会损失任何精度。

10-06 03:34