Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用矩阵将Excel中的两个100位数相乘_Excel_Matrix Multiplication_Multiplication - Fatal编程技术网

使用矩阵将Excel中的两个100位数相乘

使用矩阵将Excel中的两个100位数相乘,excel,matrix-multiplication,multiplication,Excel,Matrix Multiplication,Multiplication,我想用矩阵乘以Excel中的两个100位数字。Excel中的问题是,在15位之后,它只显示0。因此,输出也需要在一个矩阵中 第1个号码:“9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

我想用矩阵乘以Excel中的两个100位数字。Excel中的问题是,在15位之后,它只显示0。因此,输出也需要在一个矩阵中

第1个号码:“99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

第二个号码:“22222222222222222222222222222222222222222222222222222222”


输出:“22222222222222222222222222222222222222222222222222222222222222222222222222222222222222217777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777-

(1) 您需要将数字连接成一个字符串,因为这正是您需要作为函数输入的内容。原生Excel不会在数组上进行连接,因此您需要类似UDF的。所以B2包含

=concat(D1:G1)
(2) 函数的输出是一个字符串,因此需要将其拆分回单独的单元格。您可以使用另一个自定义项或这样的公式复制到:-

=IF(COLUMNS($C3:C3)>LEN($B$3),"",VALUE(MID($B3,COLUMNS($C3:C3),1)))
因此,对于一个简单的示例,它将如下所示:-


但我可能完全弄错了方向。

这可能就是OP想要的。我想我会尝试一种简单的乘法方法,看看它需要多长时间才能运行。对于两个100位数字,答案不到一秒钟。您必须选择输出范围(例如,对于200位结果为A3:GR3),并使用CtrlShift enter输入包含输入范围的公式作为数组公式,例如

两个100位数字

该方法基本上只是模拟学校数学长乘法,只是中间行不存储,而是立即添加到答案中,从而节省了大量空间

它的用途显然不是取代Karatsuba方法,而是一种可用于一次性计算的简单可验证方法

目前仅限于包含多个单元格的行的乘法(因此,如果您想乘以一个位数,则必须将其输入为例如09)

数字开头

数字中间

数字的结尾


将数组放入A1:A100和B1:B100中,然后使用三个公式:

1) 在
C2:C200
中,将其作为数组公式输入:

=MMULT(IFERROR(INDEX(A1:A100*TRANSPOSE(B1:B100),(ROW(INDIRECT("1:"&ROWS(A1:A100)*2-1))>0)+TRANSPOSE(ROW(INDIRECT("1:"&ROWS(A1:A100))))-1,MOD(ROW(INDIRECT("1:"&ROWS(A1:A100)*2-1))-TRANSPOSE(ROW(INDIRECT("1:"&ROWS(A1:A100)))),ROWS(A1:A100)*2-1)+1),0),SIGN(A1:A100+1))
2) 在
D1
中输入
=C1+INT(D2/10)
并填写到
D200

3) 在
E1
中输入
=MOD(D1,10)
并填写到
D200


E1:E200
将包含答案。

看看这篇文章?嗨,我已经看过这篇文章了。这将在文本字段中给出输出,我正在寻找一些东西,它将在2D矩阵中对数字进行分割,然后在2D矩阵中输出。对不起,我不同意。你能解释一下2d数组的布局吗?有多少行和列?好的,假设我有两个数字:1:2222:9999。第一个数组是:22,第二个数组是:9,现在有一种方法,我可以把这两个数组相乘,第三个数组X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X。我需要同样的东西来处理一个100位数的数字,就像那个好问题一样。这确实包含对Karatsuba函数的调用,但我必须承认我还没有测试过它!我假设问题更多的是以正确的形式获取输入和结果。我尝试过karatsuba函数,但它最多只能处理10位数字,我需要一个可以处理100位数字的函数。我认为karatsuba函数的全部要点是它可以处理几乎无限数量的数字?我昨天开始尝试并测试它,但是没有时间了-如果我有进展,我会告诉你的。顺便说一句,Karatsuba函数将使用正常乘法,并立即返回上面的小示例。我想,如果所有其他方法都失败了,那么另一种方法就是使用天真的长乘法,但速度会很慢。值得问一下这个计算会重复多少次?太好了。我会修改它,这样它就不会在。
Function Multiply(rng1 As Variant, rng2 As Variant)

Dim arr() As Integer
Dim arrLength, r1Length, r2Length, carry, product, digit As Integer
Dim tot, totDigit, totCarry As Integer
Dim v1, v2 As Variant

v1 = rng1
v2 = rng2
r1Length = UBound(v1, 2)
r2Length = UBound(v2, 2)

arrLength = r1Length + r2Length

' Declare 1D array with enough space

ReDim arr(1 To arrLength)

' Loop over digits in first number starting from right

For i = r1Length To 1 Step -1
carry = 0
totCarry = 0

' Loop over digits in second number starting from right

    For j = r2Length To 1 Step -1

' Calculate next digit in intermediate values (i.e. one row of long multiplication)

    product = v1(1, i) * v2(1, j) + carry
    digit = product Mod 10
    carry = Int(product / 10)

' Calculate next digit in final values (i.e. totals line of long multiplication)

    tot = arr(i + j) + digit + totCarry
    arr(i + j) = tot Mod 10
    totCarry = Int(tot / 10)

    Next j

' Process final carry

arr(i) = carry + totCarry
Next i

' Return as an array

Multiply = arr

End Function
=MMULT(IFERROR(INDEX(A1:A100*TRANSPOSE(B1:B100),(ROW(INDIRECT("1:"&ROWS(A1:A100)*2-1))>0)+TRANSPOSE(ROW(INDIRECT("1:"&ROWS(A1:A100))))-1,MOD(ROW(INDIRECT("1:"&ROWS(A1:A100)*2-1))-TRANSPOSE(ROW(INDIRECT("1:"&ROWS(A1:A100)))),ROWS(A1:A100)*2-1)+1),0),SIGN(A1:A100+1))