Algorithm 超长整数的乘法

Algorithm 超长整数的乘法,algorithm,math,64-bit,Algorithm,Math,64 Bit,有没有一种算法可以将两个任意长的整数精确相乘?我使用的语言限制为64位无符号整数长度(最大整数大小为18446744073709551615)。实际上,我希望能够通过分解每个数字,以某种方式使用无符号64位整数处理它们,然后能够将它们重新组合成字符串(这将解决乘法结果存储的问题)来实现这一点 有什么想法吗?是的,您使用的数据类型实际上是一个数字字符串(就像普通的“字符串”是一个字符字符串)。如何做到这一点高度依赖于语言。例如,Java使用BigDecimal。你在用什么语言?这通常作为家庭作业。

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


有什么想法吗?

是的,您使用的数据类型实际上是一个数字字符串(就像普通的“字符串”是一个字符字符串)。如何做到这一点高度依赖于语言。例如,Java使用BigDecimal。你在用什么语言?

这通常作为家庭作业。你在小学学到的算法会有用的。如果你需要一个真正的应用程序,可以使用一个库(其他文章中提到了几个库)。

大多数语言都有函数或库来实现这一点,通常称为Bignum库(这是一个很好的库)

如果你想自己做,我会像人们在纸上做长乘法一样做。要做到这一点,您可以使用包含数字的字符串,也可以使用位操作在二进制中进行

例如:

  45
 x67
 ---
 315
+270
----
 585
或二进制:

   101
  x101
  ----
   101
  000
+101
------
 11001
编辑:在用二进制代码编写之后,我意识到使用位运算而不是包含基数为10的字符串来编写代码要简单得多(当然也要快得多)。我编辑了我的二进制乘法示例以显示一种模式:对于底部数字中的每个1位,添加顶部数字,将1位时间的位置向左移位到一个变量。最后,该变量将包含产品


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

最简单的方法是使用教科书机制,将任意大小的数字分成32位的块

给定一个B C D*E F G H(每个块32位,总共128位)
您需要一个9 dwords宽的输出数组。 从[0..8]到0

首先执行:H*d+out[8]=>64位结果。
将低32位存储在输出[8]中,并将高32位作为进位
下一步:(H*C)+输出[7]+进位
同样,存储低32位输入输出[7],将高32位用作进位
完成H*A+输出[4]+进位后,需要继续循环,直到没有进位为止

然后用G、F、E重复上述步骤。
对于G,从out[7]开始,而不是out[8],以此类推


最后,遍历并将大整数转换为数字(这将需要一个“用一个单词除大数”例程)

如果您不能使用现有的bignum库,如GMP,请查看。有很多好的、有效的算法可以实现这一点。

这是我用C编写的代码。很好的乘法方法

char*乘法(char s1[],char s2[]{
int l1=strlen(s1);
int l2=strlen(s2);
int i,j,k=0,c=0;
char*r=(char*)malloc(l1+l2+1);//为零终止字符串添加一个字节
内部温度;
strev(s1);
strev(s2);
对于(i=0;i
//这是Karatsuba算法的JavaScript版本,运行时间比通常的乘法方法要短
功能范围(启动、停止、步进){
if(typeof stop==“未定义”){
//定义了一个参数
停止=启动;
开始=0;
}
如果(步骤的类型==“未定义”){
步骤=1;
}
如果((步骤>0&&start>=停止)| |(步骤<0&&start 0?i停止;i+=步骤){
结果:推(i);
}
返回结果;
};
函数zeroPad(数字字符串,零,左=真){
//返回在左侧或右侧添加零的字符串。
对于(范围内的var i(零)){
如果(左)
numberString='0'+numberString
其他的
numberString=numberString+'0'
}
返回数字字符串
}
函数大乘法(x,y){
x=x.toString();
y=y.toString();
如果(x.length==1&&y.length==1)
返回parseInt(x)*parseInt(y)
如果(x.长度console.log(示例)
Freebasic,我认为它没有内置此功能。不过,如果我能了解使用的算法,我愿意编写它。祝贺你,你刚刚重新发明了“农民乘法”。)有比“农民乘法”更快的乘法算法选中此项>你的代码有很多语法错误,导致编译失败。我已经修复了其中一些错误,但代码仍然不起作用。你确定这能起作用吗?为什么要删除js标记以便人们进行验证?这不是故意的,我只是重播了