计算机二级考试VB常用算法难点.docx

上传人:b****6 文档编号:6580767 上传时间:2023-01-08 格式:DOCX 页数:21 大小:120.88KB
下载 相关 举报
计算机二级考试VB常用算法难点.docx_第1页
第1页 / 共21页
计算机二级考试VB常用算法难点.docx_第2页
第2页 / 共21页
计算机二级考试VB常用算法难点.docx_第3页
第3页 / 共21页
计算机二级考试VB常用算法难点.docx_第4页
第4页 / 共21页
计算机二级考试VB常用算法难点.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

计算机二级考试VB常用算法难点.docx

《计算机二级考试VB常用算法难点.docx》由会员分享,可在线阅读,更多相关《计算机二级考试VB常用算法难点.docx(21页珍藏版)》请在冰豆网上搜索。

计算机二级考试VB常用算法难点.docx

计算机二级考试VB常用算法难点

计算机二级考试VB常用算法:

约数因子

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=10n=5

                         r=mmodn=0

                         所以n(n=5)为最大公约数

                 24与9

分析步骤:

       m=24n=9

                         r=mmodn=6

                         r≠0m=9n=6

                         r=mmodn=3

                         r≠0m=6n=3

                         r=mmodn=0

                         所以n(n=3)为最大公约数

算法实现

PrivateFunctionGCD(ByValmAsLong,ByValnAsLong)AsLong

   DimtempAsLong

   Ifm

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‘将字母A转换为10,B转换为11,….

              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,bAsString,cAsString

                          DimLAsInteger,mAsInteger,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,DemAsLong

                          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依次判别能否被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

       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,sAsInteger

   n=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

       Ifs

       aver=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,返回值是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1