(必看)2011VB上机考试常考算法大全欢迎下载@
- 格式:doc
- 大小:135.33 KB
- 文档页数:14
一.简单算法1.交换2、计数、求阶乘、累加、累乘、综合做计算此三类问题都要使用循环,①要注意根据问题确定循环变量的初值、终值或结束条件,②更要注意用来表示计数、和、阶乘的变量的初值3、求最大、最小值算法的基本思想:在所需比较的数中确定一个数为最大值max,(一般设第一个数为最大),然后其它的值依次和max比较,如果比它大则替换它,直到所有数据比较完,保存在max中的值就是所求的最大值。
4.求两个整数的最大公约数、最小公倍数等分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)(1) 对于已知两数m,n,使得m>n;(2) m除以n得余数r;(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);(4) m←n,n←r,再重复执行(2)。
例如: 求 m=14 ,n=6 的最大公约数. m n r14 6 26 2 0m=inputBox("m=")n=inputBox("n=")nm=n*mIf m < n Then t = m: m = n: n = tr=m mod nDo While (r <> 0)m=nn=rr= m mod nLoopPrint "最大公约数=", nPrint "最小公倍数=", nm/n注意:因为m、n的值在过程中被改变,所以在过程调用时m,n一般设置为byval 5.判断素数只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2~INT(m)(也可以是n-1或n/2)作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)m =val( InputBox("请输入一个数"))For i=2 To int(sqr(m))If m Mod i = 0 Then Exit ForNext iIf i > int(sqr(m)) ThenPrint "该数是素数"ElsePrint "该数不是素数"End If将其写成一函数,若为素数返回True,不是则返回FalsePrivate Function Prime( m as Integer) As BooleanDim I as integerPrime=TrueFor i=2 To int(sqr(m))If m Mod i = 0 ThenPrime=FalseExit ForendifNext iEnd Function此算法非常重要,经常考到,务必要掌握!不仅考其本身,也经常考其应用,如质因子等。
二.较复杂算法(一)排序问题比较的思想非常重要。
1.选择法排序(升序)基本思想:1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;3)依次类推,选择了n-1次后,这个数列已按升序排列。
下面给出一个示例初始状态23 78 96 18 60 15 822378 96 18 60 1582第1次交换之后15 7896 1860 23 82第2次交换之后15 18 9678 60 2382第3次交换之后15 18 23 786096 82第4次交换之后15 18 23 60 7896 82第5次交换之后15 18 23 60 78 9682第6次交换之后15 18 23 60 78 82 96第7次交换之后15 18 23 60 78 82 96程序代码如下:For i = 1 To n - 1 'n个数需进行n-1趟iMin = i 'iMin用来记录最小值的位置For j = i + 1 To nIf A(iMin) > A(j) Then iMin = j 若要降序,则改为a(j)>a(i)Next jt = A(i)A(i) = A(iMin) '交换第i个和第imin个A(iMin) = tNext I2.冒泡法排序(升序)基本思想:(将相邻两个数比较,小的调到前头)1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
我们通过一个例子进行说明初始状态23 78 96 18 60 15 82第1趟排序23 7896 18 60 15 8223 78 9618 60 15 8223 78 96 1860 15 8223 78 18 96 6015 8223 78 18 60 96 158223 78 18 60 15 96 8223 78 18 60 15 82 96第1趟排序后23 78 18 60 15 82 96第2趟排序后23 18 60 15 78 82 96第3趟排序后18 23 15 60 78 80 96第4趟排序后18 15 23 60 78 80 96第5趟排序后15 18 23 18 60 15 82第6趟排序后23 78 96 18 60 15 82程序段如下For i = 1 To n - 1For j = 1 To n-iIf a(j) > a(j+1) Then 若要降序,则改为a(j)<a(j+1)temp=a(j): a(j)=a(j+1): a(j+1)=tempEnd ifNext jNext i3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)基本思想:1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:Do While ia <= UBound(A) And ib <= UBound(B) '当A和B数组均未比较完If A(ia) < B(ib) ThenC(ic) = A(ia):ia = ia + 1ElseC(ic) = B(ib):ib = ib + 1End Ific = ic + 1LoopDo While ia <= UBound(A) 'A数组中的剩余元素抄入C数组C(ic) = A(ia)ia = ia + 1:ic = ic + 1LoopDo While ib <= UBound(B) 'B数组中的剩余元素抄入C数组C(ic) = B(ib)ib = ib + 1:ic = ic + 1Loop4插入法排序(把一个数插到有序数列中,插入后数列仍然有序)基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。
首先确定x插在数组中的位置P;(可由以下语句实现)p=1do while x>a(p) and p<=np=p+1loopa(p)—a(n)元素向后顺移一个位置以空出a(p)元素放入x,可由以下语句实现:for i=n to p step-1a(i+1)=a(i)next ia(p)=x将其写成一插入函数Private Sub Instert(a() As Single, x As Single)Dim p%, n%, i%n = UBound(a)ReDim Preserve a(n + 1)p = 0Do While x > a(p) And p < =n ' 确定x应插入的位置p = p + 1LoopFor i = n To p Step -1a(i + 1) = a(i)Next ia(p) = xEnd Sub(二)查找问题1.顺序查找法(在一列数中查找某数x)基本思想:一列数放在数组a(1)---a(n)中,待查找的数放在x 中,把x 与a数组中的元素从头到尾一一进行比较查找。
用变量p表示a数组元素下标,p初值为1,使x与a(p)比较,如果x不等于a(p),则使p=p+1,不断重复这个过程;一旦x等于a(p)则退出循环;另外,如果p大于数组长度,循环也应该停止。
(这个过程可由下语句实现)p = 1Do While x <> a(p) And p < =np = p + 1Loop下面写一查找函数Find,若找到则返回下标值,找不到返回0Option Base 1Private Function Find( a( ) As Single,x As Single) As IntegerDim n%,p%n=Ubound( a )p = 1Do While x <> a(p) And p < =np = p + 1LoopIf p>n then p=0Find=pEnd Function2.折半查找法(二分法查找)(只能对有序数列进行查找)基本思想:设n个有序数(从小到大)存放在数组a(1)----a(n)中,要查找的数为x。
用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:(1)x=a(mid),则已找到退出循环,否则进行下面的判断;(2)x<a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;(3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。
将上面的算法写成如下函数,若找到则返回该数所在的下标值,没找到则返回-1。
Function search(a() As Integer, x As Integer) As IntegerDim bot%, top%, mid%Dim find As Boolean '代表是否找到bot = LBound(a)top = UBound(a)find = False '判断是否找到的逻辑变量,初值为FalseDo While bot <= top And Not findmid = (top + bot) \ 2If x = a(mid) Thenfind = TrueExit DoElseIf x < a(mid) Thentop = mid - 1Elsebot = mid + 1End IfLoopIf find Thensearch = midElsesearch = -1End IfEnd Function(三)进制转换进制转换通常有二进制(B)、八进制(O)、十进制(D)、十六进制(H)之间的互相转换。