我在TopCoder中编码问题。在一个计算步骤中,可能会出现溢出,分析表明解决方案投放时间过长。我不明白为什么这行得通。
int normalize(int pos) {
return (int) (((long) pos % MODULO + MODULO) % MODULO);
}
变量
pos
和MODULO
都可以在-2147483648和2147483647范围内我想知道投放很长的时间有什么帮助?谢谢!
最佳答案
在Java中,long
始终为64位。当用两个不同宽度的量执行算术运算时,Java的规范说该算术运算是使用较大的数据类型完成的。
因此,通过将pos
转换为long
,所有后续算术都是使用64位long
s完成的。由于最后一步是针对32位值进行mod运算,因此结果肯定可以容纳在32位之内,因此最终的强制转换不会损失任何精度。