计算机等级考试二级VB常用算法(1):累加和连乘
1、算法说明
累加形式:V=V+e
连乘形式:V=V*e
其中:V是变量,e是递增表达式。累加和连乘一般通过循环结构来实现。
注意:需在执行循环体前对变量V赋初值。一般的,累加时置初值0;连乘时置初值为1.
举例
求N!的结果。
Private
Sub Command1_Click()
Dim n%,
i%, s&
n =
Val(InputBox("输入n"))
s =
1
For i =
1 To n
s = s *
i
Next
i
s
End
Sub
错误的写法:
Private
Sub Command1_Click()
Dim n%,
i%, s&
n =
Val(InputBox("输入n"))
For i =
1 To n
s =
1 ‘赋初值语句位置不对!
s = s *
i
Next
i
s ‘输出s的值为n,而不是n!
End
Sub
应用举例
根据下列公式,求自然对数e的的近似值。
要求:误差小于0.00001
Private
Sub Command1_Click()
Dim i%,
n&, t!, e!
e =
2
i =
1
t =
1
Do
While t > 0.00001
i = i +
1
t = t /
i
e = e +
t
Loop
"计算了"; i; "项目和是:"; e
Exp(1) ‘与上句输出值进行对比以证明算法的正确性
End
Sub
解题技巧
1) 由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。设定循环变量和通项变量,注意各变量的初值;
2) 分解通项表达式中各因子,并分别将各因子用循环变量表示;
3) 如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;
4) 根据步骤1、2、3,写出通项表达式;
5) 根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。通常是用:if 通项表达式>10^(-N) then exit do ,注意这句话一般需放在累加或者连乘式之前。
计算机等级考试二级VB常用算法(2):最值问题
1、算法说明
在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例
随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
Private Sub Command1_Click()
Dim n As
Integer, i As Integer, min As Integer, max As Integer, aver As
Single, s As Integer
n =
Val(InputBox("输入个数:"))
s = Int(Rnd
* 100) + 1
max = s
min = s
aver = s
"第1个数是:" & s
For i = 2 To
n
s = Int(Rnd * 100) + 1
Print "第" & i & "个数是:" & s
If s > max Then max = s
If s < min Then min = s
aver = aver + s
Next i
aver = aver
/ n
"max="; max; "min="; min; "aver="; aver
End Sub
解题技巧
最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。
计算机等级考试二级VB常用算法(3):素数
1、算法说明
素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。
判别某数m是否是素数的经典算法是:
对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。
Private Function sushu(ByVal n As Long) As Boolean
Dim i As
Long
For i = 2
To n - 1
If (n Mod
i) = 0 Then Exit For
Next I
If I=n then sushu=True
End Function
很显然,实际上,我们可以改进上面
For i = 2 To n – 1
为:
For i = 2 To int(sqr(m))
这样可以很好的提高效率。
以上判断是否为素数的代码务必识记!
应用举例
求100-200之内素数。
Private Sub Command1_Click()
Dim j As
Integer
For j =
100 To 200
If sushu(j) = True Then
Print j
End If
Next
j
End Sub
解题技巧
识记判断素数的算法过程,根据题意,灵活调用!
计算机等级考试二级VB常用算法(4):进制转化
1、算法说明
1) 十进制正整数m转换为R(2-16)进制的字符串。
思路: 将m不断除r取余数,直到商为0,将余数反序即得到结果。
算法实现:
Private Function Tran(ByVal m As Integer, ByVal r As Integer) As
String
Dim
StrDtoR As String, n As Integer
Do While
m <> o
n = m Mod r
m = m \ r
If n > 9 Then
StrDtoR = Chr(65 + n - 10) & StrDtoR
Else
StrDtoR = n & StrDtoR
End If
Loop
Tran =
StrDtoR
End Function
2) R(2-16)进制字符串转换为十进制正整数。
思路:R进制数每位数字乘以权值之和即为十进制数。
算法实现:
Private Function Tran(ByVal s As String, ByVal r As Integer) As
integer
Dim n As
Integer, dec As Integer
s =
UCase(Trim(s))
For i% =
1 To Len(s)
If Mid(s, i, 1) >= "A" Then
n = Asc(Mid(s, i, 1)) - Asc("A") + 10
Else
n = Val(Mid(s, i, 1))
End If
dec = dec + n * r ^ (Len(s) - i)
Next
i
Tran =
dec
End Function
解题技巧
进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字符的处理。
计算机等级考试二级VB常用算法(5):约数因子
1、算法说明
1) 最大公约数:
用辗转相除法求两自然数m、n的最大公约数。
(1) 首先,对于已知两数m、n,比较并使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行步骤(4)
(4) mßn nßr 再重复执行(2)
譬如: 10与5
分析步骤: m=10 n=5
r=m mod n=0
所以n(n=5)为最大公约数
24与9
分析步骤: m=24 n=9
r=m mod n=6
r≠0 m=9 n=6
r=m mod n=3
r≠0 m=6 n=3
r=m mod n=0
所以n(n=3)为最大公约数
算法实现
循环实现
Private Function GCD(ByVal m As Long, ByVal n As Long) As
Long
Dim temp
As Long
If m <
n Then temp = m: m = n: n = temp
Dim r As
Long
Do
r = m Mod n
If r = 0 Then Exit Do
m = n
n = r
Loop
GCD =
n
End Function
递归实现
Private Function GCD(ByVal m As Long, ByVal n As Long) As Long
Dim temp
As Long
If m <
n Then temp = m: m = n: n = temp
Dim r As
Long
r = m Mod
n
If r = 0
Then
GCD = n
Else
m = n
n = r
GCD = GCD(m, n)
End
If
End Function
2) 最小公倍数
m×n÷最大公约数
3) 互质数
最大公约数为1的两个正整数
解题技巧
该算法需要识记!
这种类型题目的扩展是约数和因子题型。
计算机等级考试二级VB常用算法(6):排序
1、算法说明
1) 选择法排序
(1) 从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;
(2) 除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位置;
(3) 以此类推,最后构成递增序列。
譬如:
8 6 9 3 2 7
第一轮交换后 2 6 9 3 8 7
第二轮交换后 2 3 9 6 8 7
第三轮交换后 2 3 6 9 8 7
第四轮交换后 2 3 6 7 8 9
第五轮无交换 2 3 6 7 8 9
程序代码如下:
Private Sub xzPaiXu(a() As Double, sheng As Boolean)
'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。
Dim i As
Integer, j As Integer
Dim temp
As Double
Dim m As
Integer
For i =
LBound(a) To UBound(a) -
1 '进行数组大小-1轮比较
m =
i '在第i轮比较时,假定第
'i个元素为最值元素
For j = i + 1 To
UBound(a) '在剩下的元素中找出最
'值元素的下标并记录在m中
If sheng
Then '若为升序,则m记录最小元素
'下标,否则记录最大元素下标
If a(j) < a(m) Then m = j
Else
If a(j) > a(m) Then m = j
End If
Next
j '将最值元素与第i个元素交换
temp = a(i)
a(i) = a(m)
a(m) = temp
Next
i
End Sub
调用该过程示例:
Option Base 1
Private Sub Command1_Click()
Dim b(6)
As Double
b(1) =
8
b(2) =
6
b(3) =
9
b(4) =
3
b(5) =
2
b(6) =
7
Call
xzPaiXu(b, True)
For i% =
1 To 6
Print b(i)
Next
End Sub
2) 冒泡法排序
选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。
譬如:
8 6 9 3 2 7
8 6 9 3 2 7
8 6 9 2 3 7
8 6 2 9 3 7
8 2 6 9 3 7
2 8 6 9 3 7
….
2 3 8 6 9 7
….
2 3 6 8 7 9
….
2 3 6 7 8 9
….
2 3 6 7 8 9
程序代码如下:
Private Sub mpPaiXu(a() As Double, sheng As Boolean)
'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。
Dim i As
Integer, j As Integer
Dim temp
As Double
Dim m As
Integer
For i =
LBound(a) To UBound(a) -
1 '进行n-1轮比较
For j = UBound(a) To i + 1 Step -1 '从n到i个元素两两进行比较
If sheng
Then '若次序不对,马上进行交换
If a(j) < a(j - 1) Then
temp = a(j)
a(j) = a(j - 1)
a(j - 1) = temp
End If
Else
If a(j) > a(j - 1) Then
temp = a(j)
a(j) = a(j - 1)
a(j - 1) = temp
End If
End If
Next
j '出了内循环,一轮排序结束
'最值元素冒到最上边
Next
i
End Sub
调用该过程代码基本同上。
计算机等级考试二级VB常用算法(7):排序
1、算法说明数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。
基本思路:首先要找到插入位置或要删除的元素。
1) 插入
代码如下:
Private Sub Command1_Click()
Dim a(10)
As Integer
Dim i As
Integer, k As Integer
For i = 0
To
9 '生成数组
a(i) = i * 3 + 1
a(i);
Next
i
"插入14"
For k = 0
To
9 '查找插入14在数组中的位置
If 14 < a(k) Then Exit For
Next
k
For i = 9
To k Step -1 '从最后元素开始逐个后移,腾出位置
a(i + 1) = a(i)
Next
i
a(k) =
14 '插入数14
For i = 0
To 10
Print a(i);
Next
i
End Sub
2) 1 4 7 10 13 16 19 22 25 28
K
删除 代码如下:
Dim a() as integer
….
ReDim a(1 to n)
…
For i=k+1 to n
a(i-1)=a(i)
Next I
Redim preserve a(1 to n-1)
计算机等级考试二级VB常用算法(8):排序
1、算法说明
1) 顺序查找
逐个元素找,如果有,则记录位置,然后跳出循环;否则,查找失败。
代码如下:
Private Sub Search(a(), ByVal Key, Index As Integer)
Dim i%
For i = LBound(a) To UBound(a)
If a(i) = Key Then '找到,将元素下标保存在index中并结束查找
Index = i
Exit Sub
End If
Next i
Index =
-1 '若没找到,则index值为-1
End Sub
2) 二分法查找
顺序查找效率低下,当数组有序排列时,可以使用二分法查找提高效率。
算法思想:
代码如下:
Private Sub birSearch(a(), ByVal low%, ByVal high%, ByVal Key,
index%)
Dim mid As Integer
If low > high
Then '没有查找到
index = -1
Exit Sub
End If
mid = (low + high) \ 2 '取查找区间的中点
If Key = a(mid) Then '查找到,返回下标
index = mid
Exit Sub
ElseIf Key < a(mid) Then '查找区间在上半部分
high = mid - 1
Else
low = mid + 1 '查找区间在下半部分
End If
Call birSearch(a, low, high, Key, index) '递归调用查找函数
End Sub
调用方法:
Private Sub Command1_Click()
Dim a(11)
a(1) = 5: a(2) = 13: a(3) = 19: a(4) = 21: a(5) = 37
a(6) = 56: a(7) = 64: a(8) = 75: a(9) = 80: a(10) = 88: a(11) =
92
Dim ind As Integer
Call birSearch(a, LBound(a), UBound(a), 21, ind)
Print ind
End Sub
计算机等级考试二级VB常用算法(9):排序
1、算法说明
1) 初等数学
递推法
又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都在旧值的基础上递推出新值,并由新值代替旧值。
问题:猴子吃桃子
小猴子有若干桃子,第一天吃掉一半多一个;第二天吃掉剩下的一半多一个…..;如此,到第七天早上要吃时,只剩下一个桃子。问小猴子一开始共有多少桃子?
分析:可以最后一天桃子数推出倒数第二天的桃子数;再从倒数第二天推出倒数第三天桃子数………..
设第n天桃子数为xn,前一天桃子数是:xn-1,则有关系:
xn=xn-1/2-1
程序如下:
Private Sub Command1_Click()
Dim n%, i%
x =
1 '第七天桃子数
Print "第七天桃子数: 1只"
For i = 6 To 1 Step -1
x = (x + 1) * 2
Print "第" & i & "天桃子数:" & x & "只"
Next i
End Sub
穷举法
又称枚举法,即将所有可能情况一一测试,判断是否满足条件,一般用循环实现。
问题:百元买鸡问题。
假定小鸡每只5角;公鸡每只2元;母鸡每只3元。现在有100元,要求买100只鸡,编程列出所有可能的购鸡方案。
分析:
设母鸡、公鸡、小鸡分别x、y、z只,则有:
x+y+z=100
3x+2y+0.5z=100
程序一:
Private Sub Command1_Click()
Dim x%, y%, z%
For x = 0 To 100
For y = 0 To 100
For z = 0 To 100
If x + y + z = 100 And 3 * x + 2 * y + 0.5 * z = 100 Then
Print x, y, z
End If
Next z
Next y
Next x
End Sub
程序二(优化)
Private Sub Command1_Click()
Dim x%, y%
For x = 0 To 33
For y = 0 To 50
If 3 * x + 2 * y + 0.5 * (100 - x - y) = 100 Then
Print x, y, 100 - x - y
End If
Next y
Next x
End Sub
2) 高等数学
求积分
近似计算积分:s=∫13(x3+2x+5)dx
代码如下:
Public Function f(ByVal x!) '被积函数
f = x * (x * x + 2) + 5
End Function
Public Function trapez(ByVal a!, ByVal b!, ByVal n%) As Single
'b、a分别为积分上下限,n为等分数
Dim sum!, h!, x!
h = (b - a) / n
sum = (f(a) + f(b)) / 2
For i = 1 To n - 1
x = a + i * h
sum = sum + f(x)
Next i
trapez = sum * h
End Function
调用:
Private Sub Command1_Click()
Print trapez(1, 3, 30)
End Sub
数论综合题
此类题目比较广泛,必须给以足够重视。
历年题目有:平方数、零巧数、拟互满数、回文数、酉完数、完数、幸运数、逆序数以及无暇素数、超级素数、因子和等。
计算机等级考试二级VB常用算法(10):字符处理
1、算法说明
1) 加密解密
最简单的加密方法是:将每个字母加一序数,例如5,这时:
“A”→”F”,”a” →”f”,”B” →”G”,”b” →”g”……”Y” →”D”, ”y” →”d”,”Z” →”E”,
”z” →”e”
解密是加密的逆操作。
界面如下:
代码如下:
Option Explicit
Private Sub Command1_Click()
Dim strInput$, Code$, Record$, c As String * 1
Dim i%, length%, iAsc%
strInput = Text1.Text
length = Len(Trim(strInput))
Code = ""
For i = 1 To length
c = mid(strInput, i, 1)
Select Case c
Case "A" To "Z"
iAsc = Asc(c) + 5
If iAsc > Asc("Z") Then iAsc = iAsc - 26
Code = Code & Chr(iAsc)
Case "a" To "z"
iAsc = Asc(c) + 5
If iAsc > Asc("z") Then iAsc = iAsc - 26
Code = Code & Chr(iAsc)
Case Else
Code = Code & c
End Select
Next i
Text2.Text = Code
End Sub
Private Sub Command3_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text1.SetFocus
End Sub
2) 统计
问题提出
统计字符或者数字出现的次数。
算法说明
以字符统计为例,设基本问题如下:
请统计一段文本中英文字母在文本中出现的次数。(不区分大小写)
如:I am a student.
得到:
A:2 d:1 e:1 I:1 m:1 n:1 s:1 t:2 u:1
分析:
由于不区分大小写,因此可定义一个大小为26(下标:0-25)的数组,每个元素依次记录A、B、C…Z字母出现的次数。
A(0)存放字母a出现的次数
A(1)存放字母b出现的次数
A(2)存放字母c出现的次数
A(3)存放字母d出现的次数
…
譬如:aabdc
代码如下:
Option
Explicit
Private
Sub Command1_Click()
Dim i As Integer, j As Integer
Dim zimu(25) As Integer
Dim allStr As String
Dim aStr As String
allStr = UCase(Text1.Text)
For i = 1 To Len(Text1.Text)
aStr = Mid(allStr, i, 1)
If aStr >= "A" And aStr <= "Z" Then
zimu(Asc(aStr) - Asc("A")) = zimu(Asc(aStr) - Asc("A")) + 1
End If
Next i
For i = 0 To 25
If zimu(i) <> 0 Then
j = j + 1
Text2.Text = Text2.Text & Chr(i + Asc("A")) & ":" &
str(zimu(i)) & " "
If j Mod 5 = 0 Then Text2.Text = Text2.Text & Chr(13) &
Chr(10)
End If
Next i
End
Sub
解题技巧
熟练运用字符处理函数,对于一些数论题,譬如逆序数等也可将数字通过CStr函数转换为字符后,利用字符处理函数来解题