关键词不能为空

当前您在: 主页 > 英语 >

VB常用十大算法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-28 08:45
tags:

-

2021年2月28日发(作者:ramsey)


1.


累加与连乘



1


、算法说明




[


分析


]


累加形式:


V=V+e










连乘形式:


V=V*e


其中:


V


是变量,


e


是递增 表达式。累加和连乘一般通过循环结构来实现。



注意:


需在执行循环体前对变量


V


赋初值。


一般累加时置初值


0



连乘时置初值为


1





[


举例


]< /p>



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






Print s


End Sub



[


应用举例


]


根据下列公式,求自然对数


e


的的近似值。

< br>



要求:误差小于




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





Print


计算了



项目和是:



Print Exp(1)

















与上句输出值进行对比以证明算法的正确性



End Sub



1


0.00001



2.


最值问题



1


、算法说明




在若干数中求最大值


,一般先取第一 个数为最大值的初值(即假设第一个数为


最大值),然后,在循环体内将每一个数与最大 值比较,若该数大于最大值,将该


数替换为最大值,直到循环结束。


求最小值


的方法类同。



求若干数平均值


,实质上就是先求和,再除以这些数的个数。



应用举例:


随机产生


n



1-100


(包括


1



100


)的数,求它们的 最大值、最小值和


平均值。



Private Sub Command1_Click()


Dim n%,



i%,



min%,



max%,



aver!,



s%





n = Val(InputBox(


输入个数


:


s = Int (Rnd * 100) + 1





max = s : min = s : aver = s





Print



1

个数是:






For i = 2 To n


s = Int(Rnd * 100) + 1








Print




个数是:



If s > max Then max = s


If s < min Then min = s


aver = aver + s


Next i





aver = aver / n





Print


End Sub


解题技 巧


:


最大值、最小值、平均值类型题目往往和数组放在一起考! 有的不仅求这


些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时 就要在


记录最大、最小值时,同时记录该值所在的行号和列号。





2


3.


素数问题



1


、算法说明




素数(质数):就是一个大于等于


2


的整数,并且只能被


1


和本身整除,而 不


能被其他整数整除的数。




判别某数


m


是否是素数的经典算法是:




对于


m


,从


I



2

< p>


3



4



……



m

< br>-


1


依次判别能否被


I


整除,只要有一个能整


除,


m

< br>就不是素数,否则


m


是素数。




Private Function sushu(ByVal n As Integer) As Boolean



Dim i As



Integer






For i = 2 To n - 1



If (n Mod i) = 0 Then Exit For



Next I



If I = n then sushu=True



End Function



很显然,实际上,我们可以改进上面





Private Function sushu(ByVal n As Integer) As Boolean



Dim i as Integer


For i = 2 to Int(Sqr(n))


If X Mod i = 0 Then Exit Function


Next i


sushu = True


End Function


这样可以很好的提高效率。




以上判断是否为素数的代码务必识记!





应用举例


:



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




实例说明




编程题



:


找出


10000


以内所有可以表示为两个平方数和的素数。




思路:首先找


10000


以内的所有素数,对于每个素数判断其是否可以表示为两个平


方数之和(即对于任意小于该素数


shu


的数


I


,如果


I



shu



I


均为平方数 ,则说明


其可以表示为两个平方数之和。)




判断数


I


是 否为平方数的方法:


Sqr(i) = Int(Sqr(i))




Private Sub Command1_Click()



Dim j As Integer, m AsInteger, n As Integer



For j = 2 To 10000




3


If sushu(j) = True Then




If pf(j, m, n) = True Then








m j &






End If



End If



Next j



End Sub




Private Function pf(ByVal shu As Integer, m As Integer, n As Integer) As Boolean



Dim i As Long






For i = 1 To shu - 1








If (Sqr(i) = Int(Sqr(i))) And (Sqr(shu - i) = Int(Sqr(shu - i))) Then




pf = True




m = i




n = shu - i










Exit Function








End If






Next



End Function







4


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 i as Integer, n As Integer, dec As Integer







s = UCase(Trim(s))







For i = 1 To Len(s)









If Mid(s, i, 1) >=










n = Asc(Mid(s, i, 1)) - Asc(









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



符的处理。





算法(五)约数因子


- -



5


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)


分析步骤:


m = 24



n = 9



24



9




r = m Mod n = 6


分析步骤:




10



5








r



0



m = 9



n = 6


m = 10



n = 5







r = m Mod n = 3






r = m Mod n = 0







r



0



m = 6



n = 3






所以< /p>


n(n=5)


为最大公约数








r = m Mod n = 0




3


为最大公约数。



算法实现


:


循环



Private Function GCD(ByVal m As Long, ByVal n As Long) As Long






Dim temp As Long, r As Long






If m < n Then temp = m: m = n: n = temp






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, r As Long


If m < n Then temp = m: m = n: n = temp


r = m Mod n


If r = 0 Then





GCD = n


Else





m = n





n = r





GCD = GCD(m, n)


End If


End Function


2)


最小公倍数:




最大公约数



3)


互质数:


最大公约数为


1


的两个正整数



解题 技巧:


该算法需要识记!


这种类型题目的扩展是


约数



因子


题型。

< p>




6


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< /p>


则为升序排列,为


False


,则为降序 排列。






Dim i As Integer, j As Integer, temp As Double, m As Integer





For i = LBound(a) To UBound(a) - 1








' < /p>


进行数组大小


-1


轮比较








m = i





















'


在第


i


轮比较时,假定第

< br>i


个元素为最值元素








For j = i + 1 To UBound(a)



'


在剩下的元素中找出最值元素的下标并赋值给


m










If sheng Then


< /p>


'


若为升序,则


m


记录最小元素下标,否则记录最大元素下标












If a(j) < a(m) Then m = j










Else












If a(j) > a(m) Then m = j










End If







Next j



































temp = a(i): a(i) = a(m): a(m) = temp




'


将最值 元素与第


i


个元素交换





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








7

-


-


-


-


-


-


-


-



本文更新与2021-02-28 08:45,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/679974.html

VB常用十大算法的相关文章