计算机二级考试VB常用算法难点Word文档下载推荐.docx
《计算机二级考试VB常用算法难点Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机二级考试VB常用算法难点Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
DimtempAsLong
Ifm<
nThentemp=m:
m=n:
n=temp
DimrAsLong
Do
r=mModn
Ifr=0ThenExitDo
m=n
n=r
Loop
GCD=n
EndFunction
2)
最小公倍数
m×
n÷
最大公约数
3)
互质数
最大公约数为1的两个正整数
解题技巧
该算法需要识记!
这种类型题目的扩展是约数和因子题型。
2、实战练习
补充代码(2003春二(9))
给定一个十进制正整数,找出小于它并与其互质的所有正整数(所谓互质数是指最大公约数为1的两个正整数,下图是程序执行画面)。
OptionExplicit
PrivateFunctiongcd(
(1)
)AsInteger
DimrAsInteger
Ifr=0Then
gcd=n
Else
(2)
EndIf
PrivateSubCommand1_Click()
DimnAsInteger,pAsInteger
n=Val(Text1)
Forp=n-1To2Step-1
If
(3)
ThenList1.AddItemp
Nextp
EndSub
编程题(2002秋上机试卷01)
生成一个三行八列的二维数组A(3,8),其中前两行元素产生的方法是:
用初值X1=26及公式Xi+1=(25×
Xi+357)Mod1024,产生一个数列:
X1、X2、......、X16。
其中X1~X8作为A的第一行元素;
X9~X16作为A的第二行元素;
A的第三行元素值取前两行同列元素的最大公约数。
最后按图示格式显示在图片框中。
计算机二级考试VB常用算法:
进制转化
十进制正整数m转换为R(2-16)进制的字符串。
思路:
将m不断除r取余数,直到商为0,将余数反序即得到结果。
算法实现:
PrivateFunctionTran(ByValmAsInteger,ByValrAsInteger)AsString
DimStrDtoRAsString,nAsInteger
DoWhilem<
>
o
n=mModr
m=m\r
Ifn>
9Then
StrDtoR=Chr(65+n-10)&
StrDtoR‘将余数n转换为字符(10转为A,11为B,依次类推,然后放到转换后字符串的前面(实现反序排列)
StrDtoR=n&
StrDtoR
Tran=StrDtoR
EndFunction
R(2-16)进制字符串转换为十进制正整数。
R进制数每位数字乘以权值之和即为十进制数。
PrivateFunctionTran(ByValsAsString,ByValrAsInteger)Asinteger
DimnAsInteger,decAsInteger
s=UCase(Trim(s))
Fori%=1ToLen(s)
IfMid(s,i,1)>
="
A"
Then
n=Asc(Mid(s,i,1))-Asc("
)+10‘将字母A转换为10,B转换为11,….
n=Val(Mid(s,i,1))
dec=dec+n*r^(Len(s)-i)
Nexti
Tran=dec
进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字符的处理。
1)
补充代码(2002秋二(9))
本程序是把给定的二进制整数转换为八进制整数。
DimaAsString,bAsString,cAsString
DimLAsInteger,mAsInteger,nAsInteger
a=InputBox("
请输入一个二进制数"
"
输入框"
)
a=String(L,"
0"
)&
a
Form=1Ton/3
b=Mid(a,3*m-2,3)
Nextm
Text1.Text=c
PrivateFunctionzh(sAsString)AsString
DimiAsInteger,nAsInteger,pAsInteger
p=1
Fori=2To0Step-1
(4)
p=p+1
zh=Str(n)
补充代码(2001春二(7))
下面程序是把给定的16进制正整数转换为10进制数。
PrivateSubForm_Click()
DimStAsInteger,DemAsLong
St=InputBox("
输入一个十六进制数"
Dem=Convert(St)
PrintSt;
"
="
;
Dem
PrivateFunctionConvert(SAsString)AsLong
DimNAsInteger,IAsInteger,SubstringAsString*1
DimPAslong,KAsLong,Asc1AsInteger
N=
P=16^N
ForI=1ToN
P=P/16
Substring=
SelectCaseSubstring
Case"
To"
9"
K=K+P*Val(Substring)
Case
Asc1=Asc(Substring)-Asc("
)+10
EndSelect
NextI
(5)
素数
素数(质数):
就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。
判别某数m是否是素数的经典算法是:
对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。
PrivateFunctionsushu(ByValnAsLong)AsBoolean
DimiAsLong
Fori=2Ton-1
If(nModi)=0ThenExitFor
NextI
IfI=nthensushu=True
EndFunction
很显然,实际上,我们可以改进上面
Fori=2Ton–1
为:
Fori=2Toint(sqr(m))
这样可以很好的提高效率。
以上判断是否为素数的代码务必识记!
应用举例
求100-200之内素数。
PrivateSubCommand1_Click()
DimjAsInteger
Forj=100To200
Ifsushu(j)=TrueThen
Printj
Nextj
EndSub
识记判断素数的算法过程,根据题意,灵活调用!
实例说明
编程题(2002年春上机试卷04)
找出10000以内所有可以表示为两个平方数和的素数。
思路:
首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明其可以表示为两个平方数之和。
判断数I是否为平方数(即是某个数的平方)的方法:
sqr(i)=int(sqr(i))
DimmAsLong,nAsLong
Forj=2To10000
Ifpf(j,m,n)=TrueThen
List1.AddItemj&
&
m&
+"
n
PrivateFunctionpf(ByValshuAsLong,mAsLong,nAsLong)AsBoolean
Fori=1Toshu-1
If(Sqr(i)=Int(Sqr(i)))And(Sqr(shu-i)=Int(Sqr(shu-i)))Then
pf=True
m=i
n=shu-i
ExitFunction
Next
编程题(2004春上机试卷03)
随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最大的素数,并给出它的位置。
最值问题
在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例
随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
PrivateSubCommand1_Click()
DimnAsInteger,iAsInteger,minAsInteger,maxAsInteger,averAsSingle,sAsInteger
n=Val(InputBox("
输入个数:
"
))
s=Int(Rnd*100)+1
max=s
min=s
aver=s
Print"
第1个数是:
s
Fori=2Ton
第"
i&
个数是:
Ifs>
maxThenmax=s
Ifs<
minThenmin=s
aver=aver+s
Nexti
aver=aver/n
max="
max;
min="
min;
aver="
aver
EndSub
解题技巧
最大值、最小值、平均值类型题目往往和数组放在一起考!
有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。
计算机二级考试VB常用算法
(1):
累加和连乘
累加形式:
V=V+e
连乘形式:
V=V*e
其中:
V是变量,e是递增表达式。
累加和连乘一般通过循环结构来实现。
注意:
需在执行循环体前对变量V赋初值。
一般的,累加时置初值0;
连乘时置初值为1.
举例
求N!
的结果。
Dimn%,i%,s&
输入n"
))
s=1
Fori=1Ton
s=s*i
Prints
错误的写法:
s=1
‘赋初值语句位置不对!
Prints
‘输出s的值为n,而不是n!
应用举例
根据下列公式,求自然对数e的的近似值。
要求:
误差小于0.00001
Dimi%,n&
,t!
,e!
e=2
i=1
t=1
DoWhilet>
0.00001
i=i+1
t=t/i
e=e+t
计算了"
;
i;
项目和是:
e
PrintExp
(1)
‘与上句输出值进行对比以证明算法的正确性
解题技巧
1)
由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。
设定循环变量和通项变量,注意各变量的初值;
2)
分解通项表达式中各因子,并分别将各因子用循环变量表示;
3)
如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;
4)
根据步骤1、2、3,写出通项表达式;
5)
根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。
通常是用:
if
通项表达式>
10^(-N)thenexitdo,注意这句话一般需放在累加或者连乘式之前。
以2002年春上机试卷06编程题为例
根据X值计算:
n=1,2,……
n项绝对值小于等于10-6为止。
1、由于循环次数不确定,因此确定用Do循环结构并定义循环变量用n表示(初值1);
用户输入的值用x表示;
通项用dblCos表示;
累加值用sum表示,初值为0;
2、分解通项式的组成
可以分解为三部分:
可以表示为:
(-1)^(n+1)
x^(2*(n-1))
比较复杂,难以直接表示
3、由于步骤2中
复杂,此时考虑使用过程。
于是定义过程,输入值是n,返回值是