相关试卷
-
1、有如下VB程序段:
Private Sub Command1_Click( )
Dims As String, i As Integer
s=Text1.Text
For i=1 To 8 Step 2
s=ds(s, i)
Next i
Text2.Text=s
End Sub
Function ds(s As String, m As Integer)As String
Dim n As Integer
n=Len(s)
If m<1 0r m>n Then ds= "位置有误"
If m=1 Then ds=Mid(s, 2, n-1)
If m=n Then ds=Mid(s, 1, n-1)
If m <n Then ds=Mid(s, 1, m-1)+Mid(s, m+1, n-m)
End Function
若在文本框Text1中输入“TXHOLLYCLASS”,执行该程序段后,文本框Text2中显示的是( )
A、THLYLS B、XHLLCLSS C、TXHOLLY D、XOLCLASS -
2、有如下VB程序段:
s="123456789"
g=""
For i=1 To 3
n=Len(s)
x=Int(Rnd*n)+1
g=g+Mid(s, x, 1)
s=Mid(s, 1, x-1)+Mid(s, x+1, n-x)
Next i
在程序执行时,若变量x的值依次为3,3,6,则最终变量区的值为( )
A、"336" B、"346" C、"348" D、"15" -
3、给定m个区间和1个数组(有n个元素),现要求根据各区间限定的取值范围,将该数组依次分割成m+1个段,具体分割方法如下:
·第1段是从数组首个元素开始,元素值都属于第1区间的最长连续元素段。如果首个元素不属于第1区间,则第1段元素个数为0。
·第1段分割后的剩余元素,用同样的方法来依次分割第2段,第3段…,第m段。
·第m段分割后的剩余元素分割到第m+1段(剩余段)。
若第p(1≤p≤m-1)段末尾连续元素的值也同时属于第p+1区间,则这块连续元素称为第P段“重叠块”,该段其余部分称为第p段“非重叠块”。由于不存在第m+1区间,这里特别规定:第m段的全部元素都分制到第m段“非重叠块”,第m段“重叠块”的元素个数为0。一个数组分段示例如图所示。图中数组第1个元素10不属于第1区间[0,5],因此第1段的元素个数为0。10和20属于第2区间,而33不属于第2区间,因此第2段只包含10和20两个元素。第3段末尾连续三个元素的值也同时属于第4区间,因此,第3段“非重叠块”包含38,58,46,第3段“重叠块”包含5,62,69。
(1)、给定2个区间依次为[10,50]、[30,80],数组各元素为“12,44,34,45,66,50,45,70”,则第1段“重叠块”中的元素个数为个。(2)、小李根据上述描述,设计了一个统计各段“非重叠块”“重叠块”和剩余段中元素个数的算法。算法的VB程序如下,请在画线处填入合适的代码。Const n=18,m=6
Dim a(1 To n)As Integer
Dim b(1 To 2*m)As Integer
b(1)、b(2)为第1区间的下限和上限,b(3)、b(4)为第2区间的下限和上限……
Dim c(1 To 2*m+1)As Integer
‘c(1)、c(2)分别存储第1段“非重叠块”和“重叠块”的元素个数;
‘c(3)、c(4)分别存储第2段“非重叠块”和“重叠块”的元素个数……
‘c(2*m-1)存储第m段“非重叠块”的元素个数,c(2m)存储第m段“重叠块”的元素个数(值为0); ‘c(2*m+1)存储剩余段的元素个数
Private Sub Command1_Click( )
Dim i As Integer,p As Integer,i As Integer,LL As Integer
‘读取n个数据并保存在数组a中,代码略
‘读取m个区间的下限和上限并保存在数组b中,代码略
For i=1 To 2*m+1
c(i)=0
Next i
i=1:p=1
L=0:LL=0
Do While ①
If IsIn(i, p)Then
If IsIn(i, p+1)Then
LL=LL+1
Else
②
LL=0
End If
i=i+1
Else
c(2*p-1)=L
c(2*p)=LL
L=0:LL=0
p=p+1
End If
Loop
If i<=n Then
c(2*p-1)=n-i+1
Else
c(2*p-1)=L
c(2*p)=LL
End If
‘输出统计结果,代码略
End Sub
‘函数IsIn用来判断a(i)值是否属于第p区间
Function IsIn(i As Integer, p As Integer)As Boolean
If p>m Then
IsIn=False
Else
If ③ Then IsIn=True Else IsIn =False
End If
End Function
以上程序段运行时,为了实现上述功能,画线处应填入的代码为:①;②;③。
-
4、 6174是一个数学黑洞数。一个任意的四位正整数(四位数字完全相同除外),将数字重新组合成一个最大的数和最小的数并相减,重复这个过程,最多七步,必得6174。如取四位数4562,按以上方法做如下运算:①6542-2456=4086;②8640-0468=8172;③8721-1278=7443;④7443-3447=3996;⑤9963-3699=6264;⑥6642-2466=4176;⑦7641-1467=6174。
程序运行界面如图所示。
在文本框Text1中任意输入一个不完全相同的四位正整数,在文本框Text2中输出掉进黑洞的步数。实现上述功能的VB代码如下,但加框处代码有误,请改正。
Private Sub Command1_Click( )
Dim a(1 To 4)As Integer
Dim x As Integer,y As Integer,c As Integer,t As Integer
x=Val(Text1.Text)
c=0
Do While x<>6174
For i=1 To 4
a(i)=x Mod 10
‘①Next i
For i=1 To 3
For j=i+1 To 4
If
Then ‘②t=a(i):a(i)=a(j):a(j)=t
End If
Next j
Next i
x=a(1)*1000+a(2)*100+a(3)*10+a(4)
y=a(1)+a(2)*10+a(3)*100+a(4)*1000
x=x-y
c=c+1
Loop
Text2.Text=Str(c)
End Sub
以上程序段运行时,为了实现上述功能,加框处代码应改正为:①;②。
-
5、尼克斯彻定理:任何一个大于等于1的整数的立方等于一串连续奇数之和,如:13=1,23=3+5,33=7+9+11。编写一个VB程序验证该定理,程序运行时,在文本框Text1中输入一个大于等于1的整数,单击“验证”按钮Command1后,在文本框Text2中显示验证结果,运行界面如图所示。

实现上述功能的VB代码如下,其中加框处代码有误,请改正。
Private Sub Command1_Click( )
Dim a,b,n,t,sum As Integer
Dim flag As Boolean,s As String
n=Val(Text1.Text)
For i=1 To n-3 Step 2
sum=0:t=i:a=t:flag=False
Do While sum<n^3 And flag=False
sum=sum+t
b=t
‘⑴If sum=n^3 Then flag=True
Loop
If flag=True Then Exit For
Next i
s=Str(n)+"^"+Str(3)+"="+Str(a)
For
To b Step 2 ‘⑵s=s+"+"+Str(i)
Next i
Text2.Text=s
End Sub
以上程序段运行时,为了实现上述功能,加框处代码应改正为:⑴;⑵。
-
6、用VB编写一个计算
的程序,程序代码如下,请补充完整。 Private Sub Command1_Click( )
Dim i, n, tAs Integer
Dim m, s As Double
s=1:t=1
n=Val(Text1.Text)
For i=2 To n
m=1
For j=1 To ①
m= ② ‘计算1/(2*i-1)!
Next j
s=s+m*t ‘累加通项式
t=-t
Next i
Text2.Text=Str(s) ‘结果显示到文本框Text2中
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②。
-
7、小发报名参加“智力大冲浪”节目。比赛规则如下:比赛开始时,参赛者将预先得到M元奖金。比赛时间分为N(N≤100)个时段,有N个小游戏,每个时段完成1个,第i个小游戏必须在规定时段t(i)
(1≤t(i)≤N)内完成,可以提前完成,但不能晚于该时段完成,否则要从奖金M元中扣去一部分奖金w(i),w(i)为自然数,不同的游戏扣去的奖金是不一样的。每个游戏必须从整时段开始。请间小炫如何安排自己做游戏的顺序,才能赢取最多的奖金?将结果输出到文本框Text1中。注意;比赛绝对不会让参赛者赔钱。例如:当N=5,M=100时,
游戏编号
1
2
3
4
5
完成期限t(i)
1
4
2
3
2
扣除奖金数w(i)
5
4
10
8
7
最优方案为:
完成时段
5
4
2
3
1
其中第一个游戏无法在期限内完成,扣除5元,最后赢取100-5=95元。
章法思想:让扣款高的游戏尽量准时完成,扣除的奖金越少,则最后赢取的奖金越多。
⑴按扣款数值从大到小排序,顺序为3,4,5,1,2。
⑵对于游戏,在时间段1到t(i)内完成的效果都是一样的,所以尽量在时间段t(i)内完成,若该时段
已经被占用,则依次考察时间段t(i)-1,t(i)-2…,1。
①考虑游戏3,放置在时间段2完成(注:t(3)=2);
②考虑游戏4,放置在时间段3完成(注:t(4)=3);
③考虑游戏5,时间段2已经被游戏3占用,放置在时间段1完成(注:t(5)-1=1);
④考游游戏1,时间段1已经被游戏5占用,不能按时完成,放到时间段5;
⑤考虑游戏2,放置在时间段4完成(注:t(2)=4)。
实现上述功能的VB程序如下。请在画线处填入合适的代码。
Dim N As Integer,M As Integer
Dim t(1 To 100)As Integer ‘变量t(i)表示第i个游戏的完成期限
Dim w(1 To 100)As Integer ‘变量w(i)表示未完成第i个游戏要扣除的奖金
Dim f(1 To 100)As Boolean ‘变量f(i)表示第i个时段是否已经被占用
Private Sub Form_Load( )
‘生成时段数量N和初始奖金数M
‘生成t数组和w数组
End Sub
Sub swap(x As Integer,y As Integer) ‘自定义过程,可以用Call语句来调用该过程
Dim z As Integer
z=x:x=y:y=z
End Sub
Sub sort( ) ‘自定义过程,可以用Call语句来调用该过程
Dim x As Integer, I As Integer, j As Integer
For i=1 To N-1
For j=i+1 To N
If w(i)<w(j)Then
Call swap(w(i),w(j)) ‘调用自定义过程
①
End If
Next j
Next i
End Sub
Private Sub Command1_Click( )
Dim i As Integer,k As Integer,p As Integer
Call sort ‘调用自定义过程
tot=0
For i=1 To n
f(i)=True
Next i
For i=1 To N ‘对每个游戏从该游戏的规定期限开始往左找时间段,找到则完成该游戏
p=-1
k=t(i)
Do While k>0 And p=-1
If f(k)=True Then
p=k
Else
②
End If
Loop
If p=-1Then tot=tot+w(i)
Next i
③
Text1.Text=Str(ans)
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
-
8、(贪心算法)最大整数问题:设有n个随机生成的正整数,将它们连接成一排,组成一个最大的多位整数。其求解思想是:先把整数转换成字符串,然后再比较ab和ba,如果ab≥ba,就把a排在b的前面,反之则把a排在b的后面。例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
小王同学编写了一个VB程序,功能如下:在列表框List1中随机生成n个1~1000之间的整数,单击“运行”按钮Command1后进行处理,最大整数结果输出在文本框Text1中。当n=5时,程序运行界面如图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)、要将按钮Command1的高度修改为800,以下赋值语句正确的是(单选,填字母:A .Command1_Height=800/B .Command1.Height=800/C .Height=800)。(2)、当n=3时,生成3个数:618,681,68,由这三个数组成的最大整数为。(3)、请在画线处填入合适的代码。Const n=5
Dim a(1 To 10)As Integer
Private Sub Command1_Click( )
Dim i, j, t As Integer
For i=1 Ton-1
For j=n To i+1 Step-1
If ① Then
t=a(j-1):a(j-1)=a(j):a(j)=t
End If
Next j
Next i
For i=1 To n
Text2. Text=Text2. Text+Str(a(i))
Next i
End Sub
Private Sub Form_Load( )
Randomize
For i=1 To n
a(i)= ②
Text1. Text=Text1. Text +Str(a(i))
Next i
End Sub
Function cmp(a As Integer,b As Integer) As Boolean
If Str(a)+Str(b)<Str(b)+Str(a) Then
cmp=True
Else
cmp=False
End If
End Function
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②。
-
9、对给定的若干种互不相同的钱币面值,编程计算最少需要多少张钱币才能凑成某个给定的钱数。给定的7种钱币面值分别为1,2,5,10,20,50,100,则凑成金额94元,需要50元一张,20元两张,2元两张,共5张纸币时,张数最少。
程序界面如图所示。
实现上述功能的VB程序如下,请在画线处填入合适的代码。
Dim a(1 To 7)As Integer
Dim b(1 To 7)As Integer
Private Sub Form_Load( )
List1.AddItem "面值 张数"
‘在数组a中从小到大存储7种钱币面值的整数值
End Sub
Private Sub Command1_Click( )
Dim n, num, k As Integer
n=Val(Text1.Text)
k=7
Do While n>0
If n>=a(k)Then
①
b(k)=b(k)+1
Else
②
End If
Loop
For i=1 To 7
If b(i)<>0 Then
num=num+b(i)
List1.AddItem Str(a(i))+" "+Str(b(i))
End If
Next i
List1.Addltem"最少"+Str(num)+" 张"
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②。
-
10、某数据存储算法如下:使用长度为n的一维数组h来存储m个不同的整数型数据(m<n),数据的存储位置t根据存储数据的值除n取余计算得到。例如使用长度为11的数组来存储67,45,1275,119,145,269,64,共7个数据,先存储第1个数据67,67 Mod 11=1,在第1个位置上目前没有数据,故存放在第1个位置上。第2个数据为45,45 Mod 11=1,而在第1个位置上已存有数据,那么查找下一位置有没有数据,现第2个位置上没有数据,故存放在第2个位置。在查找空位时,如果到了数组最后一个位置还没有空位,则从头继续查找,以此类推。举例数据存储结果如下表所示。
位置
0
1
2
3
4
5
6
7
8
9
10
数据
64
67
45
145
269
119
1275
(1)、若按上述规则,再存储一个数据79,则应存储在第个位置。(2)、当n=97时,实现上述数据存储及相应数据查找的VB程序如下,运行结果如图所示,请在画线处填入合适的代码。
Const n=97
Dim d(0 To 96)As Integer,h(0 To 96)As Integer
Dim m As Integer ‘变量m为数据个数
Private Sub Command1_Click( ) ‘数据存储
Dim i As Integer, t As Integer
‘从数据库读取数据并先存储在数组d中,代码略
List1.Clear
For i=0 To n-1
h(i)=-1 ‘数组元素初始化
Next i
For i=0 To m
①
Do While h(t)<>-1
t=(t+1)Mod n
Loop
h(t)=d(i)
Next i
For i=0 To n-1
List1. AddItem Str(i)&""& Str(h(i))
Next i
End Sub
Private Sub Command2_Click( ) ‘数据查找
Dim x As Integer, y As Integer
x=Val(Text1.Text)
y=x Mod n
x=1
Do While ②
z=z+1
y=(y+1)Mod n
Loop
If h(y)=x Then
Label2.Caption= "共查找了 "&Str(z)&"次,在第"&Str(y)&"个位置找到"
Else
Label2.Caption="共查找了" &Str(z)&"次,没有找到"
End If
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②。
(3)、将数组h中的元素值初始化为一1表示的含义是。 -
11、(约瑟夫问题)n个人围成一圈,从第1个人开始从1报数,数到3的人出圈;再由下一个人继续从1开始报数,数到3的人出圈……输出依次出圈的人的编号和最后一个留在圈里的人的编号。如输入n=8,则依次出圈的人的编号是3,6,1,5,2,8,4,最后留在圈内的是7号。
以下VB程序在a数组中保存了下一个要报数的人的编号,即若。(w)=p,则表示当第w个人报过数2后,下一个要报数的是第p号。程序在列表框Listl中输出了依次出圈的人的编号,在标签Label1中输出了最后剩下的人的编号。请完善程序。
Private Sub Command1_Click( )
Dim i As Integer, n As Integer, w As Integer, num As Integer
Dim a(1 To 100)As Integer, t As Integer
n=Val(Text1.Text)
For i=1 To n-1
a(i)=i+1
Next i
a(n)=1
w=n ‘变量w表示当前检查的是第w号数组元素,即从第n号开始检查
t=0 ‘变量t用以模拟报数
Do While ①
num=a(w) ‘当前报数的人的编号
t=t+1
If t=3 Then
List1.AddItem Str(num)
a(w)= ②
t=0
Else
③
End If
Loop
Label1.Caption=Str(w)
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
-
12、平面上有n(3≤n≤100)个房间围成一圈,编号分别为1~n,相邻的两个房间之间均有一扇门,第i个房间最多居住的人数为a(i)。初始时选择一个房间,将所有人都聚集在该房间,接着每个人都可以按顺时针方向走到相邻的房间,直到找到居住的房间。最后各个房间刚好都住满。一个人每经过一扇门花费1个单位的能量,请确定初始房间及每个人找房间的方案,使得所有人花费的能量的和最小。例如:n=5,a(1)=4,a(2)=7,a(3)=8,a(4)=6,a(5)=4。
最佳方案为初始时所有人聚集在2号房间,此时花费的最小能量为7×0+8×1+6×2+4×3+4×4=48。
实现上述功能的VB代码如下,但加框处代码有误,请改正。
Dim a(1 To 100)As Integer ‘依次存储编号为1到100的房间的最多居住人数
Private Sub Form_Load( )
‘产生n的值
‘本过程从数据库中依次读取编号为1到n的房间的最多居住人数,并存储在数组a中
‘代码略
End Sub
Private Sub Command1_Click( )
Dim i As Integer,j As Integer,w As Integer
Dim t As Long,ans As Long
ans=32767
For i=1To n
t=0
For j=0 To n-1
‘①If w=0 Then w=n
‘②Next j
If t<ans Then ans=t
Next i
Text2.Text=Str(ans)
End Sub
以上程序段运行时,为了实现上述功能,加框处代码应改正为:①;②。
-
13、一个n×n矩阵的主对角线(从左上到右下的对角线)上各个元素的总和称为这个矩阵的迹。一个矩阵转置后,新矩阵的迹和原矩阵的相等。
以3×3数据块为例,原矩阵和转置矩阵的结果如图所示。

小明发现对这个矩阵进行转置后,主对角线上的数字没有发生变化,所以决定编写VB程序随机生成一个n×n的矩降再试一下。程序实现的功能如下:在文本框Text1中输入整数n(2≤n≤10),单击“生成矩阵”按钮Command1,生成n2个10到99之间(包含10和99)的随机整数,并以n行、n列矩阵的形式显示在列表框List1中,将转置后的矩阵也显示在List1中。再单击“主对角线”按钮Command2,则在标签Label1中输出两矩阵主对角线上的元素,运行界面如图所示,程序代码如下,请在画线处填入合适的代码。

Const max=100
Dim n As Integer
Dim a(1 To max)As Integer
Dim b(1 To max)As Integer
Private Sub Command1_Click( )
n=Val(Text1.Text)
For i=1 To n*n
a(i)= ①
Next i
p=1
For i=1 To n*n
b(i)=a(p)
If i Mod n=0 Then
p=p-n*(n-1)+1
Else
②
End If
Next i
List1.Clear
List1. AddItem Str(n)+"*"+Str(n)+"方阵”
Call Output(a( ))
List1.AddItem"转置矩阵"
Call Output(b( ))
End Sub
Private Sub Command2_Click( )
Label1.Caption="原矩阵":L.abel2.Caption="转置矩阵"
For i=1 To n
Label1.Caption=Label1.Caption & Str(a(i+(i-1)*n))
Label2.Caption=label2.Caption & Str(b(i+(i-1)*n))
Next i
End Sub
Sub Output(a()As Integer)
Dim line As String
line=""
For i=1 To n*n
If i>1 And i Mod n=1 Then
List1. AddItem line
line=Str(a(i))
Else
③
End If
Next i
List1. AddItem line
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
-
14、生成之形矩阵:在文本框中输入之形矩阵的行数n(3≤n≤10),点击“生成”按钮Command1后,在List1中显示结果,程序运行界面如图所示。

实现程序的代码如下,但加框处代码有误,请改正。
Private Sub Command1_Click( )
Dim n,t As Integer,s As String
n=Val(Text1.Text)
For i=1 To n
s=""
If
Then ‘①For j=1 To n
t=t+1
s=s+ads(t)
Next j
Else
For j=1 To n-i
s=s+" "
Next j
t=t+1
‘②End If
List1.AddItem s
Next i
End Sub
Function ads(n As Integer)As String
Dim a As Integer
a=Len(CStr(n)) ‘函数CStr( )和Str( )功能类似,但输出字符时没有前导空格
If a=1 Then
ads="0"+CStr(n)
Else
ads=CStr(n)
End If
End Function
以上程序段运行时,为了实现上述功能,加框处代码应改正为:①;②。
-
15、蛇形矩阵是由1开始的自然数依次排列成的一个矩阵三角形。小强编写了一个输出n行蛇形矩阵的理序,其功能为在文本框Text1中输入数值n作为蛇形矩阵的行数,点击“输出”按钮Command1后,在List1中显示n行蛇形矩阵,程序界面如图所示。
实现上述功能的VB程序如下,但加框处代码有误,请改正。
Private Sub Command1_Click( )
Dim n,a,b As Integer
Dims As String
n=Val(Text1.Text)
For i=1 To n
s=""
For j=i To n
‘①s=s+Str(a)
Next j
‘②a=b
List1.AddItems
Next i
End Sub
以上程序段运行时,为了实现上述功能,加框处代码应改正为:①;②。
-
16、高精度除法常用于计算两个数位较大的数之间的除法运算,设被除数为s1,除数为s2,保存在字符串中。除法的基本思想是反复做减法,s1能够被s2减多少次,商就是多少。但是这样做显然比较慢。如下算法做了部分优化,以48695除以324为例:
①将324扩大100倍,32400只能被48695减去1次,则百位上的商是1;
②将324扩大10倍,3240能被前一次余的16295减去5次,则十位上的商就是5;
③对于324,不能被最后剩余的95减去,则个位上的商为0。所以最后的商的整数部分为150。
程序运行界面如图所示。
(1)、根据该算法计算5731423除以23345,十位上的商是。(2)、阅读以下程序,在画线处填入合适的代码。Dim s1, s2, s3, s, ans As String
Dim tot As Integer, t As Integer
Private Sub Command1_Click( )
Dim a, b, i, j, length As Integer
s1=Text1.Text:s2=Text2.Text:s3=""
Length=Len(s1)-Len(s2)
For i=1 To length
s2=s2+"0"
Next i
For i=0 To length
s=Mid(s2, 1, Len(s2)-1):tot=0
Do While ① or(Len(s1)=Len(s)And s1>=s)
tot=tot+1
ans="":flag=False
a=Len(s1):b=Len(s)
For j=a To 1 Step-1
t=0
If flag Then
t=-1:flag=False
End If
If b>0 Then
t=t+Val(Mid(s1, j, 1))-Val(Mid(s, b, 1))
Else
t= ②
End If
If t<0 Then
③
flag=True
End If
ans=t&ans:b=b-1
Next j
s1=Val(ans)
Loop
s3=s3&tot
Next i
i=1
Do While Mid(s3,i,1)="0"
i=i+1
Loop
Text3.Text=Mid(s3,i,Len(s3))
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
-
17、正整数n的阶乘,在数学上定义为:n!=1×2×3×…×n,如3!=1×2×3,现在输入一个正整数n(n≤30),计算出1~n中的每一个整数的阶乘的精确结果。小北按照上述要求,设计了一个求前n个正整数的阶乘问题的VB程序具有下述功能。在程序中,他采用加法代替乘法的方法来计算阶乘,如:3!=2!×3=2!+2!+2!。程序启动后在文本框Text1中输入n的值,单击“计算”按钮Command1后,在列表框List1中输出前n个数的阶乘,当n=10时,程序运行界面如图所示。
实现上述功能的VB程序如下,请在画线处填入合适的代码。
Const maxn=80
Dim i, j, k, n, r As Integer
Dim a(1 To maxn)As Integer, b(1 To maxn)As Integer
Dims As String
Private Sub Form_Load( )
List1.Clear
For i=1 To maxn
a(i)=0
Next i
End Sub
Sub array_sum(j As Integer) ‘该过程用于计算j!,并将j!的精确值按位保存在数组a中
For k=1 To j-1
For i=1 To maxn
r= ①
If r>=10 Then ② =a(i+1)+1
a(i)=r Mod 10
Next i
Next k
End Sub
Private Sub Command1_Click( )
n=Val(Text1.Text)
a(1)=1
List1.AddItem"1!="&.Str(a(1))
For j=2 To n
For i=1 To maxn
b(i)=a(i)
Next i
s=""
Call array_sum(j) ‘该语句用于调用自定义过程
s=s+Str(j)+"!="
k=maxn
Do While a(k)=0
③
Loop
For i=k To 1 Step-1
s=s+Str(a(i))
Next i
List1.Addltem s
Next j
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③。
-
18、编写“二进制加法”程序,实现如下功能:在文本框Text1和Text2中分别输入两个二进制数,单击“计算”按钮Command1,程序在位数较少的二进制数前补“0”,使两个二进制数位数相同,然后从右向左按位依次进行加法运算,最后在文本框Text3中显示相加的结果。程序运行界面如图所示。
(1)、在设计程序界面时,要设置窗体的标题为“二进制加法”,应修改窗体的属性。(2)、实现上述功能的VB程序如下,请在画线处填入合适的代码。Private Sub Command1_Click( )
Dim s1, s2, result, t As String
Dim span, jw As Integer
s1=Text1. Text:s2=Text2. Text
span=Len(s1)-Len(s2)
If span<0 Then
t=s1:s1=s2:s2=t
span= ①
End If
For i=1 To span
s2="0"+s2
Next i
jw=0:result=" "
For i= ② To 1 Step-1
x=Val(Mid(s1, I, 1))+Val(Mid(s2,i,1))+jw
jw=x\2
result=Str(x Mod 2)+result
Next i
If jw=1 Then result="1"+result
Text3. Text=result
End Sub
(3)、在文本框Text1中输入“10”,在文本框Text2中输入“11000”,单击“计算”按钮Command1后,变量b2的值是。 -
19、哥德巴赫(Goldbach)的“1+1猜想”是每个偶数都能写成两个素数之和;华林(Waring)的“1+1+1猜想”是每个不是素数的奇数,都能写成三个素数之和。这两个猜想虽然至今未被证明,但是也未曾发现反例。
现在我们来验证一个简单点的“1+1+1+1猜想”;在Text1中输入整数,单击“验证”按键Command1后,把此整数分解成任意四个素数之和的形式,并在List2中输出这四个素数。已知1≤n≤1000000。程序运行时,先求出1000000以内的所有素数,并输出到List1中。运行界面如图所示。
⑴在事件处理过程Form_Load( )中,用筛选法筛出了1~n范围内的所有素数,放置在数组p中。筛选算法是:从2开始,第一个未被筛掉的是2,2是素数,那么把2×2,2×3…,即所有2的倍数都筛掉,下一个未被筛掉的数是3,再把所有3的倍数筛掉……若下一个未被筛掉的是i,那么要把i×i,i×(i+1),i×(i+2)…筛掉,请把画线①、②处的代码补充完整。
⑵有了1~n范围内的素数表后,我们可以用枚举算法验证素数表中的四个数pa , pb , Pc , Pd。是否满足pa+pb+Pc+Pd=n。但是,范围过大,无法承受这么大的枚举量。因此我们考虑如何用哥德巴赫猜想来优化。显然n<8时是无解的,只需考虑n≥8时的情况。因为分解是任意的,那就用前两个素数2或3去分解n,余下部分用哥德巴赫的“1+1猜想”去验证即可。请把画线③、④处的代码补充完整。
Const maxn As Long=1000000 ‘这里最多验证一百万以内的“1+1+1+1猜想”
Dim p(maxn)As Boolean ‘p存放maxn以内的素数,p(i)=True表示i是素数
Private Sub Form_Load( )
Dim i As Long, j As Long, cnt As Long
For i=0 To maxn
p(i)=True
Next i
p(0)=False:p(1)=False
‘筛选法求素数表,对于maxn个数,最后一次只要筛去
的所有倍数即可For i=2 To Int(Sqr(maxn))
If p(i)Then
For j=i To ①
p( ② )=False
Next j
End If
Next i
cnt=0
For i=1 To maxn
If p(i)Then
List1.Addltem Str(i):cnt=cnt+1
End If
Next i
Label1.Caption=maxn & "内的素数,共"& cnt & "个"
End Sub
Private Sub Command1_Click( )
Dim n As Long, i As Long
n=Val(Text1.Text):List2.Clear
If n<8 Then
List2.AddItem"Impossible":Exit Sub
Else If ③ Then ‘先用两个2去分解n
List2.Addltem"2"
List2.Addltem"2"
n=n-4
Else
List2.AddItem "2" ‘用2和3去分解n
List2.AddItem "3"
n=n-5
End If
For i=2 To n ‘余下部分用哥德巴赫的“1+1猜想”来验证
If ④ Then
List2.AddItem Str(i)
List2.Addltem Str(n-i)
Exit For
End If
Next i
End Sub
以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②;③;④。
-
20、任意一个大于或等于4的偶数,都可以用两个素数之和表示,这就是哥德巴赫猜想。如:4=2+2,6=3+3,8=3+5,12=5+7,98=19+79。
编写一个验证哥德巴赫猜想的VB程序,程序运行时,在文本框Text1中输入一个大于或等于4的偶数,单击“验证”按键Command1后,如果猜想验证成功,则在文本框Text2中显示“Yes”,并在列表框List1中显示用两个素数表示该偶数的等式;否则显示“No”。程序运行界面如图所示。
实现上述功能的VB代码如下,但加框处代码有误,请改正。
Function judge(x As Integer) As Boolean
Dim j As Integer
judge=True
j=2
Do While j<=x-1 And judge=True
If x Mod j=0 Then
judge=False
Else
j=j+1
End If
Loop
End Function
Private Sub Command1_Click()
Dim n As Integer, p As Integer
Dim q As Integer, flag As Boolean
n=Val(Text1. Text)
p=1
flag=False
Do While
And p<n ‘①p=p+1
‘②If judge(p) And judge(q) Then
Text2. Text="Yes"
flag=True
List1. Addltem Str(n)+"="+Str(p)+"+"+Str(q)
End If
Loop
If flag=False Then
Text2.Text="No"
End If
End Sub
以上程序段运行时,为了实现上述功能,加框处代码应改正为:①;②。