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