专题三 算法的综合运用
1.幸运数。一组由1开始的奇数数列为:1,3,5,7,9,11,13,15,17,19,21,23,25,……此数列的第二项为3,将此数列的第3n个数删除,留下的数为:1,3,7,9,13,15,19,21,25,……,新数列的第三项为7,将新数列的第7n个数删除,留下的数为:1,3,7,9,13,15,21,25,……,若一直重复上述步骤,最后剩下的数就是幸运数:
1,3,7,9,13, 15, 21, 25, 31, 33, 37, 43, 49, 51,……
下列程序的功能是找出1000以内的幸运数,但加框处代码有错,请改正。
Private Sub Command1_Click()
Dim a(500) As Integer, b(500) As Integer
Dim i As Integer, m As Integer, k As Integer
Dim top As Integer, bott As Integer
′产生由1开始的奇数数列,依次存储在数组a中,代码略
top=2: bott=500
Do While top
′(1)
For i=1 To bott
If i Mod a(top) <>0 Then
b(k) =a(i)
k=k+1
End If
Next i
′(2)
top=top+1
For i=1 To bott
a(i) =b(i)
Next i
Loop
For i=1 To bott
Listl.AddItem Str(a(i))
Next i
End Sub
解析 a数组每次都在更新,因此b数组的下标每次总是从1开始。每一遍下来,数组中总是要减少k-1个数。
答案 (1)K=1 (2)bott=k-1
2.如图所示加密程序:在文本框Text1中输入明文,单击命令按钮“加密”,在文本框Text2中输出密文。加密算法思路如下:
1)只针对英文字符和数字进行加密,其余字符不变;
2)将原文中的小写字母转换为大写字母;
3)根据第2步所得结果,若是英文字符,则逐个后移4位(例如:A→E,Z→D),若是数字,则逐个前移2位(例如:3→1,1→9)。
综上所述:原文为Jim is at room 4!,加密后输出密文为:NMQ MW EX VSSQ 2!
(1)程序代码如下,请填空。
Private Sub Command1_Click()
Dim str1 As String, str2 As String, ch As String
Dim i As Integer, j As Integer, n As Integer
str1 = Text1.Text: str2 = ” ”: n = Len(Text1.Text)
For i = 1 To n
ch = Mid(str1, i, 1)
If ch >= ”a” And ch <= ”z” Then
______①______
End If
If ch >= ”A” And ch <= ”Z” Then
ch = Chr((Asc(ch) - Asc(”A”) + 4) Mod 26 + Asc(”A”))
ElseIf ch >= ”0” And ch <= ”9” Then
ch=Chr((__②______ ) Mod 10+Asc(”0”)) ′
End If
str2 = str2 + ch
Next i
Text2.Text = str2
End Sub
(2)若在Text1中输入的明文为:Num 15*,则程序运行后在Text2中输出的密文为:____________________________________________________________________。
解析 当ch是小写字母时转大写字母,大写字母ASCII值比小写小32。数字从0至9,构成一个环,因此先利用ASC函数把ch转0-9的数字,前移是-2,但可能会出现负数那只能加10。
答案 (1)①ch = Chr((Asc(ch) - 32)) ②Asc(ch)-Asc(”0”)-2+10 或Val(ch)+8 (2)RYQ 93*
3.使用VB程序研究“回文素数在素数表中的位置”,程序运行界面如下图所示。程序将10000以内的全部素数按顺序保存到数组a中,在文本框中输入需要查找的回文数,单击“查找”按钮Command1,在标签Label1中显示该回文素数在全部素数中的位置。
实现上述功能的程序如下,加框处的代码有错,请改正。
Dim a(1 To 10000) As Integer
Dim n As Integer
Private Sub Form_Load()
′将1000以内的素数从小到大依次存入数组a中
′将素数的个数存入变量n中
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, mid As Integer
Dim key As Integer, flag As Boolean
key = Val(Text1.Text)
If key > 10000 Or Not hws(key) Then
MsgBox ”输入的数据不是10000以内的回文数”
Else
i=1:j=n
flag = False
Do While ′(1)
mid = (i + j) \2
If key > a(mid) Then
i = mid + 1
ElseIf key < a(mid) Then
j = mid - 1
Else
flag = True
End If
Loop
If Not flag Then
Label1.Caption = ”该回文数不是素数”
Else
Label1.Caption=”回文素数”+Str(key)+”是第”+Str(mid)+”个素数”
End If
End If
End Sub
′自定义函数 hws(y)用于判断y是否是回文数
Function hws(y As Integer) As Boolean
Dim x As Integer, k As Integer
x = 0: k = y
hws = True
Do While k > 0
′(2)
k = k \10
Loop
If x <> y Then hws = False
End Function
解析 本题考查对分查找算法及其他算法。二分查找结束的条件,还有查找范围或者还没找到。自定义函数hws用于判断y是否是回文数,将十位数中每一位取出,用对10求余,然后将其累加。
答案 (1)flag=false And i<=j (2)x=x*10+k mod 10
4.“奔跑吧,兄弟”栏目组要在全国各地挑选节目录制的地点。有来自K(1<=K<=25)个不同省份的N(K<=N<=100)个地区送来了各自的竞选材料。由于参选地区太多,没有办法同时呈现所有材料供评委进行选择。栏目组决定选择一段连续区间内的参选地区,这个区间内每个省份的参选地区至少要有1个,求满足要求的最小区间长度。
参选地区用数字1,2,3…N 表示,每个地区所属的省份依次存入数组a(1)到a(N),若1号地区的省份编号是3,即a(1)=3。分析可知,所求区间的长度至少为K(省份的数量),最大为N(地区的数量)。我们可以通过二分K到N 之间的数求得最小区间长度。例如有10个参选地区,分别来自于5个不同的省份,从左到右排列,地区编号依次2,1,2,4,3,3,5,5,3,5,则最小的一段包含所有5个地区的区间是从第2个到第7个地区,区间长度为6。
(1)若有12个参选地区,分别来自于6个不同的省份,从左到右排列,地区编号依次为2,1,6,4,6,3,1,2,3,5,5,4则最小的区间长度为 ______________。
(2)请在划线处填入合适的代码。
Dim a(1 To 100) As Integer, T As Integer, N As Integer
Private Sub Form_Load()
′产生N的值,表示地区数,产生K的值,表示省份数
′产生编号为1到N 的地区的省份编号,并存储在数组a中
′代码略
End Sub
Private Sub Command1_Click()
Dim M As Integer
i = K: j = n
Do While i <= j
_____①______
If bh(M) = True Then
j = M - 1
ans = M
Else
i = M + 1
End If
Loop
Text1.Text = Str(ans)
End Sub
Function bh(M As Integer) As Boolean
Dim f(1 To 25) As Integer ′f(i)表示省份为i的地区是否包含 Dim t As Integer bh= False
For i = 1 To n - M + 1 ′枚举以i为起点的M个地区中各个省份是否都包含
For j =____②____
f(a(j)) = 1
Next j
t = 0
For j = 1 To K
____③______
Next j
If t = K Then bh = True: Exit Function
For j = 1 To K
f(j) = 0
Next j
Next i
End Function
解析 满足要求的最小区间为:4 6 3 1 2 3 5 ,区间长度为 7 。M表示区间的长度,最小为K,最大为N,通过二分K到N 之间的数求得最小区间长度ans。
自定义函数bh(M As Integer)用来判断长度为M的区间是否能包含所有省份,循环变量i指向长度为M的区间的左边界,代码For j = i To i + M - 1 表示遍历该区间内的各个地区,每次遍历该区间前先设置数组f的所有元素值均为0(题目中把该段代码放在了内层循环后面,实际上放在前面更好理解),若某个省份编号a(j)出现过,则令f(a(j)) = 1,然后用t来统计出现过的省份数量,最后判断t是否等于K,若相等则表示包含所有省份,返回True。
注意:第③空答案也可以是:If f(j) = 1 Then t = t + 1
答案 (1)7 (2)①M = (i + j) \2 ②i To i + M - 1
③t = t + f(j)
5.在文本框Text1中输入待加密的n个字符(仅由ASCII码字符构成,最多支持960个字符),输入后单击加密按钮,在文本框Text2中产生密文。加密方式如下:
①定义一个数组a(1to961)。产生一个3到6之间的随机整数k,将十进制数960均分成k份,字符在字符串中的位置除以k的余数决定该字符存放在第几份数据中(余数为1保存在第一份数据中,余数为2保存在第二份数据中……,余数为0保存在第k份数据中);
②用十进制数127减去每个字符的ASCII码值,得到的差作为该字符的密文,并保存在数组a中,同一段内的密文依次存放;
③将随机产生的数k加64后保存在数组元素a(961)中,并一起参与加密;
④将数组a中所有有密文值的数组元素从后往前依次存放到数组b中;
⑤将数组b中的每个密文用3位数字保存,不足3位的前面用0补足,然后依次连接保存在变量sc中;在文本框Text2中输出sc。
例如:
①若现有待加密的字符串为“zp123”,产生的随机数k=3,则960分成3份,每份可存放320个值,分别为a(1)至a(320),a(321)至a(640),a(641)至a(960);
②由于Asc(“z”)=122,则127-122=5。字符“z”在待加密字符串中的位置是1,除以k的余数为1,因此数字“5”放在第一份数据的第一个位置,即a(1)=5;同理可得,第一份数据为a(1)=5,a(2)=77;第二份数据为a(321)=15,a(322)=76;第三份数据为a(641)=78;
③将随机产生的k与十进制数64的和保存到a数组的最后一个值中,即a(961)=64+3=67;
④将数组a中所有有密文值的数组元素从后往前依次存放到数组b中,得到b(1)=67,b(2)=78,b(3)=76,b(4)=15,b(5)=77,b(6)=5;
⑤将数组b中的每个元素用0补足3位后依次连接并保存在sc中,得到sc=“067078076015077005”;
注:(asc(”0”)=48,asc(”A”)=65,asc(”a”)=97)
Private Sub command1_Click()
Dim a(1 To 961) As Integer
Dim sr, sc As String
Dim i, j, k, m, n, t As Integer
Dim b(1 To 961) As Integer
k = Int(Rnd * 4 + 3)
sr = Text1.Text
For i = 1 To 961
a(i) = -1
Next i
a(961) = k + 64
t = 960 / k
For i = 1 To Len(sr)
m = i Mod k - 1
n = i \k + 1
If i Mod k = 0 Then n = n - 1: m = m + k
____①____ = 127 - Asc(Mid(sr, i, 1)) ′将密文存储到数组 a 中
Next i
For i = 1 To Len(sr) + 1
j = j + 1
Do While a(j) = -1
j = j + 1
Loop
b(Len(sr) + 2 - i) = a(j) ′将有密文值的 a 数组元素存储到数组 b 中
Next i
For i = 1 To Len(sr) + 1
sc = ____②____ ′连接密文并保存到 sc 中
Next i
Text2.Text = sc
End Sub
Function space(x As Integer) As String
For i = 1 To ____③____
space = space & ”0”
Next i
End Function
(1)若加密后的密文为“068029041”,则随机数是____ ;在 Text1 中输入的明文是____ 。
(2)在划线处填写缺失的代码。
答案 (1)4 Vb (2)①a(m * t + n)
②sc & space(b(i)) & b(i) 或 sc + space(b(i)) + b(i)
③4 - Len(Str(x))
6.小林发给小周一串密文“VghpcyBpcyBhbiBleGFtcGx1”,并告诉小周,这串密文由明文字符串(仅包含ASCII字符,且字节数为3的倍数)经以下规则加密而成:
(1)将明文ASCII码分成3个字节一组,顺次连接后得到24位二进制数;
(2)将得到的24位二进制数字按每6位一组分成4组,每组6个位;
(3)在(2)中得到的6个位前补上两个0,得到4个字节的二进制数;
(4)将(3)中得到的四个二进制数分别转换为十进制数;
(5)将每个十进制数转换为1个加密字符,对应的“密码表”按数值由0到63依次为“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
小周按照上述规则,设计了一个解密VB程序,功能如下:单击“解密”按钮Command1,
程序依次将文本框Text1中每4个密文字符按加密规则转换为3个明文字符,连接这些明文字符,最后在文本框Text2中输出结果。程序运行效果如下图所示。
实现解密功能的VB程序如下,请回答下列问题:
(1)若密文字符串的长度是120,则解密后明文字符串的长度是______。
(2)请在划线处填入合适代码。
Function Char2Int(c As String) As Integer
If c >= ”A” And c <= ”Z” Then ′字母”A”的 ASCII 码是 65
Char2Int = Asc(c) - 65
ElseIf c >= ”a” And c <= ”z” Then ′字母”a”的 ASCII 码是 97
Char2Int = Asc(c) - 71
ElseIf c >= ”0” And c <= ”9” Then ′数字”0”的 ASCII 码是 48
______①____
ElseIf c = ”+” Then
Char2Int = 62
Else
Char2Int = 63
End If
End Function
Private Sub Command1_Click() ′解密过程
Dim n As Integer, s As String, i As Integer, ss As String
Dim a(0 To 3) As Integer ′依次存储一组4个密文按密码表换算出的数值
Dim b(0 To 2) As Integer ′依次存储一组3个明文字符的 ASCII 值
s = Text1.Text
n = Len(s)
ss = ” ”
For i = 1 To n Step 4
For j = i To i + 3
a( ____②______)=Char2Int(Mid(s,j,1))
Next j
b(0) = a(0)*4 + a(1)[ST6
____③____
b(2)=(a(2) Mod 4)*64+a(3)
For j = 0 To 2
ss = ss + Chr(b(j))
Next j
Next i
Text2.Text = ss
End Sub
解析 每3个字母加密成4个字母。自定义函数是求c在密码表中位置,“密码表”按数值由0到63排列,0应转换成52。
答案 (1)90 (2)①Char2Int = Asc(c) + 4 ②(j - 1) Mod 4 ③b(1) = (a(1) Mod 16)*16 + a(2)[BT
7.回文数是从左向右读和从右向左读结果一样的数字串,例如:1和363都是回文数。编写VB程序,构造一个大于给定正整n的最小回文数p。构造方法如下:
(1)根据数字串n的左半部分子串st,构造对称的右半部分,生成回文数p;
(2)若p>n,则p即为最小回文数,如:98712→98789。
(3)若p<=n,则需重新构造p,方法是:从右向左查找字符串st中第一个非“9”的字符;若不存在,则形成“10…01”的回文数p,p的长度比n的长度多1为,如9999→10001。若存在,则将第一个非“9”字符加1,并将该字符后面部分用字符“0”填充,最后构造对称的右半部分,生成回文数p,如:98992→99099。98989
实现上述功能的VB程序如下,请回答下列问题:
(1)如果n为69999,则p为________。
(2)请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim n As String, st As String, p As String
Dim 1n As Integer, i As Integer, j As Integer
n = Text1.Text
1n = Len(n)
st = Mid(n, 1, (ln + 1) \'2)
p = st
For i = ln \2 To 1 Step -1
p = p + Mid(n, i, 1)
Next i
If____①____Then
i = (1n + 1) \2
Do While i > 0
If Mid(st,i,1)=”9” Then____②____ Else Exit Do
Loop
If i < 1 Then
p = ”1”
For i = 2 To 1n
p = p + ”0”
Next i
p = p + ”1”
Else
p = Mid(st, 1, i - 1)
p = p + Chr(Asc(Mid(st, i, 1)) + 1)
For j = i + 1 To 1n - i
p = p + ”0”
Next j
If____③____ Then p = p + Mid(p, i, 1)
For j = i - 1 To 1 Step -1
p = p + Mid(p, j, 1)
Next j
End If
End If
Text2.Text = p
End Sub
解析 第一步转换成69996,第二步转换成70007。p是形成的回文数,若p<=n,需要重新构成回文数。需要查找非9的数,需如果是9,继续往前找。
答案 (1)70007 (2)①p <= n 或val(p)<=val(n)
②i=i-1 ③1n Mod 2 = 0 Or i < (1n + 1) \'2
或not (1n Mod 2 = 1 and i =(1n + 1) \'2
8.最大回文子串。回文字符串是具有回文特性的字符串:即该字符串从左向右读,与从右向左读都一样.如:凤落梧桐梧落凤,abcba等。“最大回文子串”是指一个字符串中长度最大的回文字符串,其基本算法思想如下:
(1)每个回文都有一个“中心”,当回文字符数为奇数时,中间的那个字符就是回文中心;但是当回文的字符数为偶数时,回文的中心是最中间的那两个字符,且这两个字符相同。
(2)对任意一个字符或者相同的两个连续字符,我们都可以假设它为回文的“中心”,向它的左右两边扩展出尽可能长的回文。对于每种假设,我们都能得到一个回文,而最长回文必定由其中的某个假设中得到。
现编写一个VB程序,在Text1中输入一串字符,单击“统计”按钮,在Text2中显示该字符串中的最大的回文子串(长度相同时,输出最左边的子串)。运行界面如图所示。
请回答下列问题:
(1)当 Text1 中输入“123321344332423112113123”时,则输出的结果为__________。
(2)请在划线处填入合适的代码。
Dim n As Integer
Dim a(0 To 100) As String
Private Sub Command1_Click()
Dim s As String
Dim left As Integer, right As Integer, i As Integer
Dim max As Integer, m As Integer, b1 As Integer
′变量 b1 用于记录回文子串的左端起点
Text2.Text = ” ”
s = Text1.Text
n = Len(s)
For i = 1 To n
a(i) = Mid(s, i, 1)
Next i
max = 0: left = 0: right = 0
For i = 1 To n
left = i
right = i
m = longest(left, right)
If m > max Then
____①____
max = m
End If
left = i
right = i + 1
If a(left) = a(right) Then
m = longest(left, right) + 1
If m > max Then
b1 = i - m \2 + 1
max = m
End If
End If
Next i
For i = b1 To ____②____
Text2.Text = Text2.Text + a(i)
Next i
End Sub
Function longest(left As Integer, right As Integer) As Integer
Dim p As Integer
p = 1
Do While left > 1 And right < n And ____③____
left = left - 1
right = right + 1
p = p + 2
Loop
longest = p
End Function
答案 (1)3112113 (2)①b1 = i - m \2 ②b1 + max - 1 ③a(left - 1) = a(right + 1)
9.火柴棒等式。用火柴棒可以摆出0-9的数字,摆放规则如下图所示:
有一种火柴棒游戏,将火柴棒摆成形如“A+B=C”的火柴棒等式。
用n根火柴棒摆放数学等式的规则约定如下:
(1)A、B都是不大于1000的正整数,若数值非零,则最高位不能是0。
(2)摆放“+”与“=”各使用两根火柴棒。
(3)A+B=C 与 B+A=C 视为相同的等式。
(4)n根火柴棒必须全部用上。
小明依据上述规则使用VB编写程序,研究“使用n根火柴棒,可以摆放出哪些不同的等式”,代码如下所示。
请回答下列问题。
(1)某次运行程序时,显示的等式中包含“7+17=24”,根据程序分析,输入的n的值为:________。
(2)请在划线处填入合适的代码。
Dim sz(0 To 9) As Integer ′数组元素sz(i)用于存储数字i所使用的火柴棒的数量
Private Sub Form_Load()
sz(0)=6:sz(1)=2:sz(2)=5:sz(3)=5:sz(4)=4
sz(5)=5:sz(6)=6:sz(7)=3:sz(8)=7:sz(9)=6
End Sub
′自定义函数hcs用于求解摆放数字x需要使用的火柴棒数量
Function hcs(ByVal x As Integer) As Integer
Dim s As Integer,k as integer
s = 0
Do While____①______
k = x Mod 10
s=s+sz(k)
x = x \10
Loop
hcs = s + sz(x)
End Function
Private Sub Command1_Click()
Dim n As Integer
Dim a As Integer, b As Integer, c As Integer
n = Val(Text1.Text)
ans = 0
List1.Clear
For a = 0 To 999
For b = ____②____ To 999
c = a + b
If ____③____ Then
List1.AddItem (Str(a) + ”+” + Str(b) + ”=” + Str(c))
ans = ans + 1
End If
Next b
Next a
List1.AddItem (”共有” + Str(ans) + ”种等式”)
End Sub
解析 本题采用的是枚举算法。题目中告知A+B=C 与 B+A=C 视为相同的等式,所以若a的枚举范围为0~999,那么b的枚举范围应为a~999。自定义函数的调用。Hcs函数用来计算摆放数x需要用掉多少根火柴,那么等式a+b=c用掉的火柴的数量为hcs(a)+hcs(b)+hcs(c)+4(加号与等号需要的火柴数量),如果该等式的值为n时,即是符合条件的等式。
答案 (1)21 (2)①x>=10 ②a ③hcs(a)+hcs(b)+hcs(c)=n-4
10.ROT-13(回转13位)是一种简易的替换式密码,编码解码规则相同,针对英文字母,仅仅只需要检查字母顺序并用13位后的对应字母取代它,超过时则重新绕回26个英文字母开头即可。即A换成N、B换成O,以此类推到M换成Z,然后序列反转;N换成A、O换成B……
小明决定以ROT-13为基础制定新的ROT-n,即每次回转不是13位,而是n位。因此他引入了11位数字密钥和字符位置来计算n的值,并扩大加密范围,使得大小写字母和数字都能加密,从而达到加密效果增强的目标。具体规则如下:
(1)字符在奇数位置上n的值即当前对应密钥值,偶数位置上n的值为当前段密钥中已经出现的所有数字之和。
(2)数字字符在“0”到“9”之间回转,即超过“9”部分返回“0”开始继续计算;大写字母在“A”到“Z”范围内回转,小写字母在“a”到“z”范围内回转,其它字符不变。
例如:当密钥为“123”时,对应加密方式如下:
第一段 第二段 第三段 ……
字符位置 1 2 3 4 5 6 7 8 9
密钥 1 2 3 1 2 3 1 2 3
n的值 1 3 3 1 2 6 1 3 3
原文 H e 1 1 o 2 0 1 9
密文 I h o m q 8 1 4 2
程序界面如下图所示:
程序代码如下:
Private Sub Command1_Click()
Dim i, z, m, js As Integer
Dim s, c, h, t As String
Const my = ”14159265358”
Text2.Text = ” ”
s = Text1.Text
z = 1
For i = 1 To Len(s)
____①____
If z = 12 Then z = 1: js = 0
m = Val(Mid(my, z, 1))
js = js + m
If ____②____Then n = js Else n = m
If c >= ”0” And c <= ”9” Then
h = CStr((Val(c) + n) Mod 10)
ElseIf c >= ”A” And c <= ”Z” Or c >= ”a” And c <= ”z” Then
t = Chr(Asc(c) + n Mod 26)
If c >= ”A” And c <= ”Z” Then
If Not(t>=”A”Andt<=”Z”) Then h = Chr(Asc(t) - 26) Else h = t
Else
If Asc(c)+n Mod 26>122 Then h=Chr((Asc(c)+n Mod 26)-26) Else h = t
End If
Else
h = c
End If
Text2.Text = Text2.Text + h
____③____
Next i
End Sub
请回答下列问题:
(1)解密过程为加密过程的逆运算,即由密文字符向前推导n 位寻找原字符,现已知密钥为123,密文“WEjpqj”(无双引号)对应的原文是__________。
(2)程序功能实现则代码中划线部分请填入合适代码
①处代码__________;②处代码__________;③处代码__________。
答案 (1)VBgood (2)①c=mid(s,i,1) ②i mod 2 =0 (或等效答案) ③z=z+1
11.输入一个正整数N,寻找一个比N大且最接近N的整数,要求这个数的每位数字之和与N的每位数字之和相同。例如N=1231,则满足上述条件的最接近N的整数为1240。为了解决此问题,设计算法如下:
①从右往左扫描,找第一个非0数字,将该数字减1后移到最后面。
②在当前位置继续往左扫描,找第一个非9的数字,若遇到,将该数字加1,结束;若遇到9,将其移到最后面,重复执行②。
③若扫描完没有加1,则最前面补”1”。
例如:N=199000,按照上述算法的处理过程是:199000→190008→100089→200089,满足条件的最接近的数是200089。
(1)若输入N=99900,则满足条件的最接近的数为______。
(2)实现上述功能的VB代码如下,请在划线处填入适当的代码。
Private Sub Command1_Click()
Dim a(1 To 50) As String
Dim n As String, step1 As Boolean, step2 As Boolean
Dim i As Integer, length As Integer, zero As Integer, cnt As Integer
n = Text1.Text
length = Len(n)
′将数字串n从右往左依次存储在数组a中。
For i = 1 To length
a(i) =____①____
Next i
step1 = True: step2 = False ′step1对应步骤①,step2对应现步骤②
zero = 0: cnt = 1
For i = 1 To length
If step1 = True Then
If a(i) = ”0” Then
zero = zero + 1
Else
____②____
If zero > 0 Then
a(cnt) = a(i)
a(i) = ”0”
End If
step1 = False
step2 = True
End If
ElseIf step2 = True Then
If a(i) = ”9” Then
If zero = 0 Then
t=a(cnt+1):a(cnt+1)=a(cnt):a(cnt)=t
cnt = cnt + 1
If i <> cnt Then
a(i) = a(i - 1)
End If
Else
____③____
a(cnt) = ”9”
a(i) = ”0”
cnt = cnt + 1
End If
Else
a(i) = a(i) + 1
step2 = False
Exit For
End If
End If
Next i
′最前面补”1”
If step2 Then
length = length + 1
a(length) = ”1”
End If
′输出结果,代码略。
End Sub
解析 (1)N=99900,按照上述算法的处理过程是:99900→99008→90089→00899→100899。
(2)将输入的n倒着存放在数组a中,便从右往左扫描。第一个步骤找第一个非0数字,将该数字减1后移到最后面。
答案 (1)100899 (2)①Mid(n,length-i+1,1)
或Mid(n,Len(n)-i+1,1) ②a(i)=a(i)-1 ③a(cnt+1)=a(cnt)
12.学校筹办社团节,每个社团先到A场地做“准备”,然后到B场地“风采展示汇报”。同一场地,同一时间只允许一个社团使用。每个社团使用A、B场地时间都有所不同。已知学校共n个社团,第i个社团使用A场地时长为a[i]分钟,使用B场地时长为b[j]分钟。为了更高效的组织这次活动,某同学编写了如下VB程序计算此次活动的最小总时长和社团参会的顺序。
算法思路:
1.统计m(i)表示第i个社团中在A和B两个场地中用时的较小值。
2.按m(i)值从小到大排序,然后按m(i)值的顺序,逐个社团安排参会顺序,策略如下:为了使得总时长最短,让A场地用时最少的最先开始;B场地用时最少的最后开始。对于每个社团,若m与该社团在A场地使用时间相同,则将它排在利余的可排位置的最前面,若m(j)与该社团B场也使用的时间相等,则将它安排在剩余可排位置的最后面。例如:N=5,社团序号分别是{1,2,3,4,5}
1至5号社团使用A场地的时间依次为:{3,5,8,7,10},1至5号社团使用B场地的时间依次为:{6,2,1,4,9},
按上述算法可求得5个社团m[j]的值依次为:{3,2,1,4,9}。
(1)按上述算法策略,5个社团中最先进入A场地的社团的序号是________(填数字)。
(2)请在划线处填入合适的代码。
Dim s(1 To 100) As Integer ′s(i)表示第 i社团存储社团序号
Dim a(1 To 100) As Integer ′a(i)表示第 i社团使用A场地时间
Dim b(1 To 100) As Integer ′b(i)表示第i社团使用B场地时间
Dim m(1 To 100) As Integer ′m(i)表示 第i社团两个场地用时间的较小值
Dim ans(1 To 100) As Integer ′ans(i)表示第 i个参会的社团序号
Dim n As Integer
Private Sub Form_Load()
′从文件中读取N的值和每个社团使用A场地和B场地的时间分别存入a(i)和b(i),代码略
End Sub
Private Sub Commandl_Click0()
For i = 1 To n
m(i) = (i): s(i) = i
If ______①____ Then m(i) = b(i)
Next i
For i = 1 To n - 1
For j = i + 1 To n
If m(i) > m(j) Then
t=m(i):m(i)=m(j):m(j)=t
t=s(i):s(i)=s(i):s(i)=t
End If
Next j
Next i
′安排社团参会顺序
k = 0: t = n + 1
For i = 1 To n
If____②______ Then
k = k + 1
ans(k) = s(i)
Else
t = t - 1
ans(i) = s(i)
End If
Next i
′输出第i个参会的社团的序号ans(i)
For i = 1 To n
Listladditem ”第” + Str(i) + ”个参会的社团序号为” + s(ans(i))
Next i
′根据当前社团參会顺序,计算总时长
k = 0: t = 0
For i = 1 To n
k = k + a(ans(i))
If t < k Then ____③____
t = t + b(ans(i))
Next i
List1.AddItem ”最少的总用时:” + Str(t)
End Sub
解析 (1)A场地比B场地小的唯一只有1号社团,因此1号社团是最先进入A场地,3号社团是最后进入B场地。
(2)m(i)是计算a(i)和b(i)的较小值,因此当b(i)(3)s(i)表示第 i社团存储社团序号,m数组已经有序,如果m记录的是a数组中放在前面,否则放在后面。
答案 (1)1 (2)①b(i)②m(i)=a(s(i)) ③t=k