-
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)
‘
p>
与上句输出值进行对比以证明算法的正确性
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
,
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
以内所有可以表示为两个平方数和的素数。
p>
思路:首先找
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
)进制的字符串。
p>
思路:将
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
p>
,
m = 9
,
n
= 6
m = 10
,
n = 5
r = m Mod n = 3
r =
m Mod n = 0
r
≠
p>
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)
最小公倍数:
m×
n÷
最大公约数
3)
互质数:
最大公约数为
1
的两个正整数
解题
技巧:
该算法需要识记!
这种类型题目的扩展是
约数
和
因子
题型。
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
'
p>
在第
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
-
-
-
-
-
-
-
-
-
上一篇:分形之Julia集及其算法实现
下一篇:西门子DMG加工中心指令