m=n:
n=temp
DimrAsLong
Do
r=mModn
Ifr=0ThenExitDo
m=n
n=r
Loop
GCD=n
EndFunction
2)
最小公倍数
m×n÷最大公约数
3)
互质数
最大公约数为
1的两个正整数
解题技巧
该算法需要识记!
这种类型题目的扩展是约数和因子题型。
2、实战练习
1)补充代码(2003春二(9))
给定一个十进制正整数,找出小于它并与其互质的所有正整数(所谓互质数是指最大公约数为1的两个正整数,下图是程序执行画面)。
OptionExplicit
PrivateFunctiongcd
(
(1)
)AsInteger
DimrAsInteger
r=mModn
Ifr=0Then
gcd=n
Else
m=n:
n=r
(2)
EndIf
EndFunction
PrivateSubCommand1_Click()
DimnAsInteger,pAsInteger
n=Val(Text1)
Forp=n-1To2Step-1
If
(3)ThenList1.AddItemp
Nextp
EndSub
2)编程题(2002秋上机试卷01)
生成一个三行八列的二维数组A(3,8),其中前两行元素产生的方法是:
用初值X1=26及公式Xi+1=(25×Xi+357)Mod1024,产生一个数列:
X1、X2、......、X16。
其中X1~X8作为A的第一行元素;X9~X16作为A的第二行元素;A的第三行元素值取前两行同列元素的最大公约数。
最后按图示格式显示在图片框中。
计算机二级考试VB常用算法:
进制转化
1、算法说明
1)十进制正整数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,依次类推,然后放到转换后字符串的前面(实现反序排列)
Else
StrDtoR=n&StrDtoR
EndIf
Loop
Tran=StrDtoR
EndFunction
2)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("A")+10将字‘母A10,B11,⋯.
Else
n=Val(Mid(s,i,1))
EndIf
dec=dec+n*r^(Len(s)-i)
Nexti
Tran=dec
EndFunction
解技巧
制化的原理要清楚,同写代候要留意16制中的A-F字符的理。
2、
1)充代(2002秋二(9))
本程序是把定的二制整数八制整数。
PrivateSubCommand1_Click()
DimaAsString,bAs
String,cAsString
DimLAsInteger,mAs
Integer,nAsInteger
a=InputBox("入一个
二制数","入框")
(1)
a=String(L,"0")&a
(2)
Form=1Ton/3
b=Mid(a,3*m-2,
3)
(3)
Nextm
Text1.Text=c
EndSub
PrivateFunctionzh(sAsString)AsString
DimiAsInteger,nAsInteger,pAsInteger
p=1
Fori=2To0Step-1
(4)
p=p+1
Nexti
zh=Str(n)
EndFunction
2)补充代码(2001春二(7))
下面程序是把给定的16进制正整数转换为10进制数。
OptionExplicit
PrivateSubForm_Click()
DimStAsInteger,DemAs
Long
St=InputBox("输入一个十
六进制数")
Dem=Convert(St)
PrintSt;">=";Dem
EndSub
PrivateFunctionConvert(SAsString)AsLong
DimNAsInteger,IAsInteger,SubstringAsString*1
DimPAslong,KAsLong,Asc1AsInteger
N=
(1)
P=16^N
ForI=1ToN
P=P/16
Substring=
(2)
SelectCaseSubstring
Case"0"To"9"
K=K+P*Val(Substring)
Case(3)
Asc1=Asc(Substring)-Asc("A")+10
(4)
EndSelect
NextI
(5)
计算机二级考试VB常用算法:
素数
1、算法明
素数(数):
就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。
判某数m是否是素数的典算法是:
于m,从I=2,3,4,⋯⋯,m-1依次判能否被
不是素数,否m是素数。
PrivateFunctionsushu(ByValnAsLong)AsBoolean
DimiAsLong
Fori=2Ton-1
If(nModi)=0ThenExitFor
NextI
IfI=nthensushu=True
EndFunction
I整除,只要有一个能整除,
m就
很然,上,我可以改上面
Fori=2Ton–1
:
Fori=2Toint(sqr(m))
可以很好的提高效率。
以上判断是否素数的代必!
用例
求100-200之内素数。
PrivateSubCommand1_Click()
DimjAsInteger
Forj=100To200
Ifsushu(j)=TrueThen
Printj
EndIf
Nextj
EndSub
解题技巧
识记判断素数的算法过程,根据题意,灵活调用!
实例说明
编程题(2002年春上机试卷04)
找出10000以内所有可以表示为两个平方数和的素数。
思路:
首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即
对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明其可以表示为两个平方数之和。
)
判断数I是否为平方数(即是某个数的平方)的方法:
sqr(i)=int(sqr(i))
PrivateSubCommand1_Click()
DimjAsInteger
DimmAsLong,nAsLong
Forj=2To10000
Ifsushu(j)=TrueThen
Ifpf(j,m,n)=TrueThen
List1.AddItemj&"="&m&"+"&n
EndIf
EndIf
Nextj
EndSub
PrivateFunctionpf(ByValshuAsLong,mAsLong,nAsLong)AsBoolean
DimiAsLong
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
EndIf
Next
EndFunction
编程题(2004春上机试卷03)
随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最大的素数,并给出它的位置。
计算机二级考试VB常用算法:
最值问题
1、算法说明
在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),
然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,
直到循环结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例
随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
PrivateSubCommand1_Click()
DimnAsInteger,iAsInteger,minAsInteger,maxAsInteger,averAsSingle,sAsIntegern=Val(InputBox("输入个数:
"))
s=Int(Rnd*100)+1
max=s
min=s
aver=s
Print"第1个数是:
"&s
Fori=2Ton
s=Int(Rnd*100)+1
Print"第"&i&"个数是:
"&s
Ifs>maxThenmax=s
Ifsaver=aver+s
Nexti
aver=aver/n
Print"max=";max;"min=";min;"aver=";aver
EndSub
解题技巧
最大值、最小值、平均值类型题目往往和数组放在一起考!
有的不仅求这些值,还要对
具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值
时,同时记录该值所在的行号和列号。
计算机二级考试VB常用算法
(1):
累加和连乘
1、算法说明
累加形式:
V=V+e
连乘形式:
V=V*e
其中:
V是变量,e是递增表达式。
累加和连乘一般通过循环结构来实现。
注意:
需在执行循环体前对变量V赋初值。
一般的,累加时置初值0;连乘时置初
值为1.
举例
求N!
的结果。
PrivateSubCommand1_Click()
Dimn%,i%,s&
n=Val(InputBox("输入n"))
s=1
Fori=1Ton
s=s*i
Nexti
Prints
EndSub
错误的写法:
PrivateSubCommand1_Click()
Dimn%,i%,s&
n=Val(InputBox("输入n"))
Fori=1Ton
s=1
‘赋初值语句位置不对!
s=s*i
Nexti
Prints
‘输出
s的值为
n,而不是
n!
EndSub
用例
根据下列公式,求自然数e的的近似。
要求:
差小于0.00001
PrivateSubCommand1_Click()
Dimi%,n&,t!
,e!
e=2
i=1
t=1
DoWhilet>0.00001
i=i+1
t=t/i
e=e+t
Loop
Print"算了";i;"目和是:
";e
PrintExp
(1)‘与上句出行比以明算法的正确性
EndSub
解技巧
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,返回值是
privateFunctioncomp(naslong)aslong
dimIaslong
dimresultaslong
result=1‘此处注意,由于是连乘,初值为
forI=1to2*(n-1)
result=result*I
nextI
comp=result
EndFunction
1
注意:
由于是参数按地址传递,因此对于本题,实参的值不能在过程中被改变!
是改错题常考的地方!
!
)
4、根据步骤1、2、3,写出通项dblCos的表达式:
dblCos=(-1)^(n+1)*x^(2*(n-1))/comp(n)
(也
5、根据精度要求知:
Ifabs(dblCos)<=10^(-6)
thenexitdo
最后程序为:
PrivateSubCommand1_Click()
DimnAsLong,dblCosAsDouble,
xAsDouble
x=Val(Text1.Text)
n=1
Do
dblCos=(-1)^(n+1)*x^(2*(n-1))
IfAbs(dblCos)<=10^(-6)ThenExitDo
Sum=Sum+dblCos
n=n+1
Loop
PrintSum
EndSub
PrivateFunctioncomp(nAsLong)AsLong
DimIAsLong
DimresultAsLong
result=1'此处注意,由于是连乘,初值为1
/comp(n)
ForI=1To2*(n-1)
result=result*I
NextI
comp=result
EndFunction
注意:
如果运行死循,可以按Ctrl+Break中断死循,不需要重新启机器。
(或者Ctrl+ScrollLock)
2、
1)充代(2003秋二(7))
本程序的功能是求下面数列前
n之和。
S(x,n)=x/2+2!
*x^3/2*4+3
!
*x^5/2*4*6+
⋯⋯+n!
*x^2n-1/2*4*6
⋯⋯2n
OptionExplicit
PrivateSubCommand1_Click()
DimxAsSingle,sAsSingle
DimnAsInteger,iAsInteger
x=InputBox("入X:
","求数列和",1)
n=InputBox("入N:
","求数列和",1)
Fori=1Ton
s=s+fun(x,i)
Nexti
Label1.Caption=_
(1)_
Text1=s
EndSub
PrivateFunctionfun(xAsSingle,nAsInteger)AsSingle__
(2)__
p=1
Fori=1Ton
__(3)___
Nexti
fun=x^(2*n-1)*p
EndFunction
2)程(2003春上机卷03)
按下列公式写求分余弦函数的程序。
当通小于10-5停止算。
计算机二级考试VB常用算法:
排序
(1)
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
程序代码如下:
PrivateSubxzPaiXu(a()AsDouble,shengAsBoolean)
'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。
DimiAsInteger,jAsInteger
DimtempAsDouble
DimmAsInteger
Fori=LBound(a)ToUBound(a)-1'进行数组大小-1轮比较
m=i'在第i轮比较时,假定第i个元素为最值元素,m记录小值元素的数组下标
Forj=i+1ToUBound(a)'在剩下的元素中找出最值元素的下标并记录在m中
IfshengThen'若为升序,则m记录最小元素下标,否则记录最大元素下标
Ifa(j)Else
Ifa(j)>a(m)Thenm=j
EndIf
Nextj'将最值元素与第i个元素交换
temp=a(i)
a(i)=a(m)
a(m)=temp
Nexti
EndSub
调用该过程示例:
OptionBase1
PrivateSubCommand1_Click()
Dimb(6)AsDouble
b
(1)=8
b
(2)=6
b(3)=9
b(4)=3
b(5)=2
b(6)=7
CallxzPaiXu(b,True)
Fori%=1To6
Printb(i)
Next
EndSub
计算机二级考试VB常用算法:
排序
(2)
2)冒泡法排序
排序法在每一排序找最元素的下,出了内循(一排序束)
,再交最小
数的位置;而冒泡