1. 求最长升序子序列的长度。一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是升序的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些升序的子序列(ai1, ai2, ..., aiK),这里 1 <= i1 < i2 < ...<iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些升序子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。小王设计VB程序用于求最长升序子序列的长度,在文本框Text1中输入n个各不相同的数据(各数据之间以逗号隔开),单击“求解”按钮Command1后在标签Label1中输出最长升序子序列的长度,运行界面如图所示。

具体算法描述如下:

⑴将文本框Text1中的n个数据依次读取到数组a中;

⑵构造一个数组b(j),j表示升序子序列的长度,b(j)的值表示所有j长度升序序列中最小的末尾元素值。例:序列(2,6,4,5),长度为2的子序列有(2,6)、(2,4)、(2,5)、(4,5),则b(2)=4;

⑶从第1个元素开始,依次处理到第i(1≤i≤n)个元素为止,b数组所能达到的最大下标值maxlen,处理过程分两种情况:

A.a(i)>b(maxlen),则最长升序子序列的长度增加;

B.a(i)<b(maxlen),则在b数组中逆序查找到第一个b(j)>a(i)(maxlen-1≤j≤1),更新数组b中升序子序列长度为j+1时所存储的元素值。

以图中数据为例:

⑷数组b的最大下标值即为最长升序子序列的长度。实现上述过程的VB程序如下,请回答下列问题:

(1) 若在文本框Text1中输入的序列为(4,7,9,8,6),则数组元素 b(2)的值为
(2) 请在划线处填入合适的代码

Private Sub Command1_Click()

Dim a(1 To 100) As Integer '存储原序列

Dim b(1 To 100) As Integer '存储各长度序列的最小末尾元素Dim s As String

Dim n As Integer, i As Integer, j As Integer, maxlen As Integer s = Text1.Text

n = 1: j = 1

For i = 1 To Len(s) c = Mid(s, i, 1)

If c = "," Then

a(n) = Mid(s, j, i - j ) n = n + 1

j = i + 1 End If

Next i

 maxlen = 1: b(1) = a(1) For i = 2 To n

If a(i) > b(maxlen) Then

maxlen = maxlen + 1 b(maxlen) = a(i)

Else

j = maxlen - 1: flag = True Do While j >= 1 And flag

If a(i) > b(j) Then

flag = False End If

j = j - 1 Loop

IfThen b(1) = a(i)

End If Next i

Label1.Caption = "最长升序子序列的长度为:" + Str(maxlen)

End Sub

【考点】
常见数据类型、数组; 运算符、基本运算与表达式;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 普通
能力提升
换一批
1. 在一个数组中存储了若干个同学的技术成绩小题分,其中a(1)存储学生个数,a(2)开始按顺序存储小题分数据。每个学生有33个小题的数据,例:a(2)~a(13)是学生1的信息选择题得分,a(27)~a(30)是学生1的信息4个主观题得分。具体如下表

题号

1-12

13-25

26-29

30-33

科目题型

信息客观题

通用客观题

信息主观题

通用主观题

满分分值

每题2分

每题2分

4/8/7/7

6/9/3/6

小李根据上述描述,设计了一个统计所有同学信息各题得分率的算法。程序运行后首先在列表框list1显示信息技术各小题得分,单击“计算”按钮“command1”,在列表框list2显示信息各题的题号和得分率,在文本框text1输出所有同学的信息平均分(平均分=各题得分率*各题分值的和)。算法的VB程序如下,回答下列问题。

(1) 根据题目描述,使用如图所示数据,a(95)的数值是
(2) 在程序划线处填上合适代码,使程序完整

    Dim a(1 To 1000) As Integer, n As Integer

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer

        Dim fz(1 To 16) As Integer 'fz数组存储信息各题满分值

        Dim b(1 To 33) As Double   '数组b存储全卷各题的得分率

            For i = 1 To 16  ‘数组fz存储信息16个小题的满分值

              If i <= 12 Then fz(i) = 2

              fz(13) = 4: fz(14) = 8: fz(15) = 7: fz(16) = 7

            Next i

            For i = 2 To n  '把数组a数据分别统计到各题中

                 

              b(j) = a(i ) + b(j)  

            Next i

            For i = 1 To 33  '仅处理信息各题的平均分

              If i <= 12 Then

                b(i) = b(i) / (a(1) * fz(i))’计算信息选择题各题的得分率

            ElseIf i >= 26 And i <= 29 Then

                b(i) =

            End If

            Next i

            For i = 1 To 16

          If i > 12 Then j = i + 13 Else j = i

          b(j) = Int(b(j) * 1000 + 0.5) / 10 '对结果四舍五入保留1位小数

          List2.AddItem Str(i) +  Str(b(j)) + "%"

            ave=   

            Next i

          Text1.Text = Str(ave / 100)

          End Sub

          Private Sub Form_Load()

          ‘读入数据到数组a,数据个数n,代码略

     End Sub

综合题 困难
2. 当计算机程序中无法用普通数据类型表示位数较多的乘数和计算结果时,就需要采用高精度乘法。如,当两个各有20位数字的整数相乘时,就无法用长整型(Long)数据类型来表示。高精度乘法运算就是运用数组,用程序模拟列竖式计算的过程。两个正整数进行高精度乘法计算的一般算法如下:

⑴将第一个整数各位上的数字按照从低位到高位的顺序依次存入数组a(1)、a(2)、…、a(La)中,将另一个整数各位上的数字按照从低位到高位的顺序依次存入数组b(1)、b(2)、…、b(Lb)中。其中,La表示第一个整数的位数,Lb表示第二个整数的位数;

⑵按照从低位到高位的顺序,将两个整数各位数值进行逐位乘法计算(第一轮先让b(1)依次乘a(1)、a(2)…a(La),第二轮再让b(2)依次乘a(1)、a(2)、…、a(La),依次进行),每位的乘法结果也按照低位到高位的顺序依次存入数组ans(1)、ans(2)、ans(3)中;

⑶对数组ans中的计算结果进行从低位到高位的进位处理;

⑷统计数组ans中实际计算结果的有效数值位数,并将位数值存入变量length;

⑸按照高位到低位的顺序输出数组ans中的计算结果。

小明按照上述方法设计了一个两数进行高精度乘法计算的VB程序,功能如下:在文本框Text1和Text2中依次输入两个整数,单击“计算”按钮Command1,程序进行高精度乘法计算,并在标签Label4中输出计算结果。

实现上述功能的VB程序如下:

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

Dim a(1 To 30) As Integer, b(1 To 30) As Integer

Dim ans(1 To 60) As Integer

Dim La As Integer, Lb As Integer

Dim length As Integer

Private Sub Command1_Click()

Dim i As Integer, j As Integer, t As Integer, temp As String

‘将两个乘数(正整数)各数位上的数字按照上述算法依次存入数组a和b,每个正整数位数分别保存到变量La和Lb;将保存结果的数组ans(i)值初始化为零(该部分程序代码略)

For i = 1 To Lb    ‘按低位到高位的顺序进行列竖式的逐位乘法

 For j = 1 To La

  ans(i + j - 1) = + b(i) * a(j) 

 Next j

Next i

For i = 1 To La + Lb    ‘对计算结果进行进位处理

 ans(i+1) =ans(i +1)+ ans(i) \ 10

 ans(i) =

Next i

length = La + Lb    ‘最多位数

Do While ans (length) = 0    ‘计算实际位数

 length = length - 1

Loop

For i =To 1 Step -1

 Label4.Caption = Label4.Caption + Str(ans(i))

Next i

End Sub

(2) 根据本题算法,若输入的两个整数分别为5125和18,则在输出乘法计算结果时,变量length的值为
综合题 普通