可靠的乘法和模数,数字大于maxint

时间:2018-01-26 13:35:31

标签: algorithm performance modular-arithmetic

场合
在处理coding kata之后,我终于得到了算法来处理我的小测试用例 只是发现它没有大规模工作,时间不是问题,而是数字的大小 在我在其中一个测试用例中的一个计算中,我需要执行以下计算。

var numberOfColumns = 34359738368;
var numberOfRows = 28827050410;
var valueOverflow = 13719506;
var totalOfSingleRow = (numberOfColumns * (numberOfColumns - 1))/2;
var totalGridValue = totalOfSingleRow * numberOfRows;
var result = (totalOfSingleRow * totalGridValue) % valueOverflow;

因为顶行是连续的,所以我可以通过(numberOfColumns * (numberOfColumns - 1))/2;来计算第一行的总和 然后我需要将该答案乘以行数并应用模数来获得我的结果值。

问题
问题是Javascript只能用小于9007199254740991的数字来计算可靠性 只有上面的计算结果为totalGridValue 17016487081526963049249353236480 你可以想象我的计算不会产生10552574的期望值,因为该值被截断为1.7016487081526963e + 31。 这导致错误的8479672

问题
如何更改我的计算结果,使结果成为所需的10552574 我已经尝试在numberOfColumns上更快地应用模运算符而没有所需的结果。
我还考虑将两个大值添加为字符串,但这个过程会变慢,因为我必须多次添加两个字符串。

注意
因为我需要在代码大战中提交,所以我不能使用任何外部库! 我可以使用其他语言,但我知道它可以在javascript中使用。

1 个答案:

答案 0 :(得分:1)

我认为你是在正确的轨道上将模数运算进一步向上移动,但我不会使用模运算符。相反,使用常规浮点除法,并将该值传递到最后一步,当完成所有其他计算时,然后将该浮点数的小数部分转换为整数。基本上,对于纯粹的划分,你只是在对价值进行转换,而不是改变价值。一旦你去模数,你就改变了价值。 (我也会改变totalSingleRow公式来除以大值然后乘以结果,而不是乘以然后除以。)