·将字符串(均为大写字符)s 依次转换为相对应的数值(字符 A~Z 对应数值 1~26);
·转换后的数值以K 个数据为一段,将 n 个待处理的数据依次分割成若干段(最后一段不足部分用 0 来补充);
·每一段中K 个数据与K*K 转置矩阵进行乘法运算;
·将乘法运算得到的每一个结果值除以 26 求余数,依次转换成相应字符(数值 1~26 对应字符
A~Z),最后按原始字符串长度输出。乘法运算规则如下:
第 i 个元素 c(i) = 第 j 个元素 a(j) * 转置矩阵第i 行第 j 个元素 b(t)的乘积之和
(其中 j = 1 , 2 … K)
例如:字符串 s = PYTHON,区块大小 K = 4 的转置过程如下:
(1)根据算法描述,上述示例中,字符“N”的相乘结果(即图中(★)处)为 ______。
(2)请在划线处填入合适代码。
Private Sub Command1_Click()
Dim a(1 To 100) As Integer ‘存储字符串,长度不超过 100 个字符Dim b(1 To 100) As Integer ‘存储转置矩阵,长度不超过 10*10 Dim c(1 To 100) As Long
Dim s As String, tmp As String
Dim k As Integer, t As Integer, i As Integer, j As Integer
Dim n As Integer, m As Integer, lens As Integer
s = Text1.Text ‘在 Text1 中输入原始字符串k = Val(Text2.Text) ‘在 Text2 中输入区块大小 K
Randomize
For i = 1 To k ^ 2
b(i) = Int(Rnd * 9) + 1
tmp = tmp + Str(b(i))
If i Mod k = 0 Then
List2.AddItem tmp
tmp = ""
End If
Next i
For i = 1 To n
tmp = Mid(s, i, 1)
__①__
List1.AddItem Str(a(i)) Next i
Do While n Mod k <> 0
n = n + 1
a(n) = 0
List1.AddItem Str(a(n)) Loop
For i = 1 To n
m = (i - 1) Mod k + 1
t = 1
For j = ___②___ c(i) = a(j) * b((m - 1) * k + t) + c(i) t = t + 1
Next j
Next i
For i = 1 To n
List3.AddItem Str(c(i))
Next i
s = ""
For i = 1 To lens
___③___
s = s + Chr(t + 64)
Next i
Text3.Text = s ‘在 Text3 中输出转置后的字符串
End Sub
【答案】
(1) 89 (1分)
(2) ① a(i) = Asc(tmp) - 64 或 a(i) = Asc(tmp) - Asc(“A”) + 1 (2分)
② i – m + 1 To i – m + k (2分)
③ t = (c(i) – 1 ) Mod 26 + 1 (2分)
【本题解析】
本题重点在于乘法运算规则的理解以及转置矩阵b(t)中行列数据的读取。根据算法描述,图中(1)处的值为15*5+14*1+0*2+0*9=89。程序先随机生成数组b,其下标为1到k*k,并以行列的形式显示在列表框中(即为转置矩阵),然后将读取的大写字符串s转换成相应ASCII值存储在数组a中。
代码①处为字符转成相应数值,根据后续代码可知为获取数组元素a(i)的值,根据题干描述“字符A~Z对应数值1~26”,此处为将tmp获取的字符通过ASC函数进行转换,语句为Asc(tmp) – 64。还可以是Asc(tmp) – Asc("A") + 1。代码②处为循环变量j的取值范围,根据乘法规则,变量j的范围是1到k之间,这里的1到k之间的取值在数组中需要分段进行,准确说是每一段中的1到k之间的值,需要获取每一段的起始位置下标,结合上文得到的m值,可得循环变量的范围为:i – m + 1 To i – m + k。代码③处是将计算结果c(i)按原长度转换成相应大写字符。计算结果要求Mod 26,若直接写成c(i) Mod 26,则导致数值26的结果为0,因此需要先减1,Mod后再加1这样的处理技巧,因此答案为(c(i) – 1) Mod 26 + 1。