很轻松网

VB_Python代码对照算法百题(015)

VB_Python代码对照算法百题(015)

VB代码: (2017年11月浙江)17.由数组a生成数组b的方法描述如下: 

1) 将数组a中的n个元素依次分割出若干个数据块,每个数据块有m×m个元素,m最大值为8,最小值为2。分割时,按尽可能大的数据块进行分割; 

2) 对每个分割出的数据块用“方阵转换法”进行转换,每次转换后得到的数据块依次存储在数据b中; 

3) 数组a分割后的剩余元素(个数小于4),直接依序存储到数组b中。 

例如n=140时,可依次分割出3个数据块,元素的个数分别为64(8×8)、64(8×8)、9(3×3),剩余元素为3个。 

“方阵转换法”过程如下:将数据块中m×m个元素按行序排列成一个数字方阵,从该数字方阵中按列序得到转换后元素的次序。以3×3数据块为例,转换过程如下图所示: 

VB_Python代码对照算法百题(015) 小明依据上述描述设计了如下VB程序。请回答下列问题: 

(1)当n=120时,分割出的第3个数据块元素个数为 。 

(2)请在划线处填入合适的代码。 

Const n = 120 

Dim a(1 To n) As Integer 

Dim b(1 To n) As Integer 

Private Sub Command1Click()

Dim m As Integer, i As Integer

Dim Start As Integer ‘当前未分割数据的第1个元素下标

Dim Left As Integer ‘当前未分割数据的个数

Dim pa As Integer ‘数组a的下标

Dim pb As Integer ‘数组b的下标

‘读取n个转换前的数据,依次存储到a(1)、a(2)、……a(n)中,代码略

m = 8

Start = 1

Left = n

Do While Left > 3

 If Left < m * m Then

  m =     ①
 Else

  pa = Start

  pb = Start

  For i = 1 To m * m

   b(pb) = a(pa)

   pb = pb + 1

   If i Mod m = 0 Then

        ②
   Else

    pa = pa + m

   End If

  Next i

       ③
 Start = Start + m * m

 End If

Loop

For i = Start To n

 b(i) = a(i)

Next i

‘依次输出转换后数据b(1)、b(2)、……b(n)中,代码略

End Sub

参考答案:

(1)4
(2) ①m=m-1或 m=int(sqr(left)) ②pa=start+im 或pa=start+i/m 或pa=pa-(m-1)m+1 或 pa=start+(pa-start+1) mod m ③left=left-m*m

Python代码: 

a=[1756,1754,1875,962,1690,1897,1789,1768,1478,1945, 1364,1234,1256,1456,1423,1756,1878,1456,1878,1787, 1987,1654,1635,1536,1765,1980,1850,1765,1720,1743, 1756,1746,1748,1789,1788,1488,1758,1756,1479,1423, 1523,1543,1546,1523,1258,1359,1357,1356,1456,1459, 1457,1458,1578,1579,1574,1576,1546,1548,1574,1678, 1687,1698,1655,1623,1624,1654,1652,1678,1657,1644, 1899,1399,1389,1356,1359,1357,1375,1367,1364,1988, 1855,1457,1689,1788,1356,1235,1987,1568,1699,1654, 1235,1238,1247,1599,1245,1356,1258,1345,1322,1222, 1234,1345,1346,1432,1567,1981,1786,1674,1799,1342, 1541,1453,1675,1654,1567,1543,1438,1324,1543,1324]

n=len(a)

b=a[:]

m = 8

start = 0

left = n

while left>3:

    if left<m*m-1:

       m=m-11

    else:

        pa=start

        pb=start

        for i in range(mm-1):

            b[pb]=a[pa]

            pb=pb+1 <

            if (i+1)%m==0:

                pa=start+(i+1)//m

            else:

                pa=pa+m

                left=left-m*m 

                start=start+m*m

for i in range(start,n):

    b[i]=a[i]

print(‘数组b:’,b)

VB_Python代码对照算法百题(015) VB_Python代码对照算法百题(015)

Python代码运行结果:

VB_Python代码对照算法百题(015)

赞 ()
分享到:更多 ()
WWW.HQS123.COM 少儿编程很轻松!
留言与评论(共有 0 条评论)
   
验证码: