繁体   English   中英

将范围为10 ^ 18的两个数字相乘

[英]Multiply two numbers whose range is 10^18

有一个变量first_variable ,它始终是某个数字的mod_value 在每一步中, first_variable都乘以某个数second_variable

所有这三个变量的范围是110^18

为此,我建立了一个公式,

first_variable = ((first_variable%mod_value)*(second_variable%mod_value))%mod_value

但这给出了错误的答案,

例如,如果first_variable and second_variable(10^18)-1并且mod_value = 10^18

请给我建议方法,以便first_variable始终会给出正确的答案。

似乎您正在使用运行时,其中使用64位整数实现算术。 您可以使用乘数2 ^ 32来检查此值:如果乘积为0,我的猜测是正确的。 在这种情况下,您应该切换到任意长算法实现,或者至少切换到比当前算法长得多的算法。 例如,Python支持最大为2 ^ 1016(256 ^ 127)的整数,与Erlang相同。

我在注释中看到您使用C ++。 如果是这样,请查找GMP库和类似物。 或者,如果128位足够,现代GCC可通过自己的库支持它。

这基本上是溢出的,因此您应该为mod_value使用不同的值(最大10 ^ 9),或者限制第一个值和第二个值的范围。

您的数字是O(10^36) ,这是O(2^108) ,它不能适合Java或C ++等语言的任何原始数据类型。 在C ++或Java中使用BigInt,或者在python中使用numpy克服它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM