我想在Excel中使用矩阵乘以两个100位数字。 Excel中的问题是,在15位数后,它只显示0.因此,输出也需要在矩阵中。
第1号:“999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999”
第二号:“2222222222222222222222222222222222222222222222222222222222222222222222222222”
输出:“2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777778”
答案 0 :(得分:2)
这可能是OP所追求的。我想我会尝试一种天真的乘法方法,看看它需要多长时间才能运行。对于两个100位数字,答案不到一秒钟。您必须选择输出范围(即A3:GR3表示200位结果)并使用 Ctrl Shift 输入例如
=Multiply(A1:CV1,A2:CV2)
两个100位数字。
该方法基本上只是学校数学长乘法的模拟,除了中间行没有存储但立即添加到答案中,因此节省了大量空间。
它的实用性显然不是它取代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
答案 1 :(得分:0)
好吧它可能会这样: -
(1)您需要将数字连接成一个字符串,因为这是您作为函数输入所需的内容。原生Excel不会对数组进行连接,因此您需要一个像this one这样的UDF。所以B2包含
=concat(D1:G1)
(2)函数的输出是一个字符串,因此您需要将其拆分回单独的单元格。您可以使用另一个UDF或像这样复制的公式: -
=IF(COLUMNS($C3:C3)>LEN($B$3),"",VALUE(MID($B3,COLUMNS($C3:C3),1)))
因此,对于简单示例,它看起来像这样: -
但我可能完全没有完成任务。
答案 2 :(得分:0)
将数组放入A1:A100和B1:B100,然后使用三个公式:
1)在=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))
中输入数字公式:
D1
2)在=C1+INT(D2/10)
中输入D200
并填写E1
。
3)在=MOD(D1,10)
输入D200
并填写E1:E200
。
<asp:Gridview runat="server" id="gvChemDates" CssClass="c_gvv"
onselectedindexchanged="getValues" AutoGenerateSelectButton="True" />
将包含答案。