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

Multiply two 100-Digit Numbers inside Excel Using Matrix

我想使用矩阵将 Excel 中的两个 100 位数字相乘。 Excel中的问题是15位后,只显示0。所以,输出也需要在Matrix中。

第一个数字:“9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999”

第二个数字:“222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222”

Output: "22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222217777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777778"

好的,它可能会像这样工作:-

(1) 您需要将数字连接成一个字符串,因为这是您需要的函数输入。本机 Excel 不会对数组进行串联,因此您需要像 this one 这样的 UDF。所以 B2 包含

=concat(D1:G1)

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

=IF(COLUMNS($C3:C3)>LEN($B),"",VALUE(MID($B3,COLUMNS($C3:C3),1)))

所以对于简单的例子,它看起来像这样:-

但我可能完全搞错了。

这可能就是OP所追求的。我想我会尝试一种朴素的乘法方法,看看 运行 需要多长时间。两个 100 位数字的答案不到一秒。您必须 select 输出范围(即 A3:GR3 对于 200 位结果)并使用 Ctrl[ 输入包含输入范围的公式作为数组公式=37=]Shift输入例如

=Multiply(A1:CV1,A2:CV2)

两个 100 位数字。

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

它的用处显然不是因为它是Karatsuba方法的替代品,而是一种简单的可验证方法,可以用于一次性计算。

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

数字开头

中间的数字

数字结束

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

将数组放入 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 将包含答案。