algorithm - 非常长的整数的乘法

标签 algorithm math 64-bit

是否有一种算法可以将两个任意长的整数精确相乘?我使用的语言限于 64 位无符号整数长度(最大整数大小为 18446744073709551615)。实际上,我希望能够通过分解每个数字,使用无符号 64 位整数以某种方式处理它们,然后能够将它们重新组合成一个字符串来做到这一点(这将解决相乘结果的问题存储)。

有什么想法吗?

最佳答案

大多数语言都有执行此操作的函数或库,通常称为 Bignum 库(GMP 是一个很好的库。)

如果你想自己做,我会像人们在纸上做长乘法一样做。为此,您可以使用包含数字的字符串,或者使用按位运算以二进制形式执行此操作。

例子:

  45
 x67
 ---
 315
+270
----
 585

或者二进制:

   101
  x101
  ----
   101
  000
+101
------
 11001

编辑:在用二进制完成后,我意识到使用按位运算而不是包含以 10 为底的数字的字符串进行编码会更简单(当然也更快)。我编辑了我的二进制乘法示例以显示一个模式:对于底部数字中的每个 1 位,将顶部数字添加到一个变量中,向左移动 1 位的位置 .最后,该变量将包含产品。

要存储产品,您必须有两个 64 位数字,并且假设其中一个是产品的前 64 位,另一个是产品的第二个 64 位。您必须编写代码,将第二个数字的第 63 位与第一个数字的第 0 位相加。

关于algorithm - 非常长的整数的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/193398/

相关文章:

arrays - 计算数组中元素的更好算法?

python - in 运算符和 for 循环之间的区别?

java - 用于操纵帆船的控制算法或函数

string - Dart:根据用户输入的字符串进行计算,包括数学运算符

c++ - 为什么在 C++ 中使用 cin、cout 或 %I64d 优于 %lld 说明符?

c++ - 在不破坏多字节序列的情况下找到最长的 UTF-8 序列

algorithm - 嵌套循环的运行时间(大O)

javascript - 如何阻止 javascript 格式化数字?

.Net 3.5 Windows 窗体应用程序 : x86 vs x64 load times on 64 bit Vista

C# - 如何在 Windows 64 位上获取程序文件 (x86)