* ****** *** ****** **** ****** ***** ****** ****** ******
8)使用数组输入十个评委的评分,要求去除最高分、最低分,求应试者的最后得分。
解答:
Public Sub exer848()
Dim score(1 To 10) As Double Dim i As Integer
Dim min, max, sum As Double For i = 1 To 10
score(i) = Val(InputBox(\输入分数\Next
min = score(1) max = score(1) For i = 1 To 10
sum = sum + score(i) If score(i) > max Then max = score(i) End If
If score(i) < min Then min = score(i) End If Next
sum = sum - max - min
Debug.Print \最后得分为\End Sub
9)编程求2到100间的所有素数,并求它们的和。
10)使用循环嵌套语句编程求:在0至999的范围内,找出所有这样的数,其值等于该数中各位数字的立方和。如:153 = 12+52+32
解答1:
Public Sub exer8410() Dim a, b, c As Integer Dim num, sum As Integer For num = 1 To 999
a = num \\ 100 '也可用int(num/100) b = (num Mod 100) \\ 10 c = num Mod 10
If a ^ 3 + b ^ 3 + c ^ 3 = num Then Debug.Print num
* *** ***** *******
End If Next num End Sub
解答2:
Public Sub exer8410b() Dim a, b, c As Integer Dim num, sum As Integer For a = 0 To 9
For b = 0 To 9 For c = 0 To 9
num = 100 * a + 10 * b + c
If num > 0 And num = a ^ 3 + b ^ 3 + c ^ 3 Then Debug.Print num End If Next c Next b Next a End Sub
11)有一个分数数列:,,,,23581321,,?1235813求出这个数列前20项之和。
解答:
Public Sub exer8411() Dim i, a, b As Integer Dim sum As Double a = 2 b = 1
For i = 1 To 20
sum = sum + a / b a = a + b b = a - b Next i
Debug.Print sum End Sub
12)已知二年期人民币整存整取年利率为2.25%,王大妈选择二年期整存整取,存款金额10000元,她希望有1000元以上的净利息。由于银行对最后的利息征20%所得税,故至少要税前为1250元利息,才有1000元的净利息。请你编程帮王大妈算一算,要存几年才能达到她的目标。
解答:
Public Sub exer8412() Dim i As Integer Dim m As Double
m = 10000 i = 0
Do While m < 11250
m = m * (1 + 0.0225) i = i + 1
Debug.Print m Loop
Debug.Print i * 2 End Sub
13)编写一个过程Swap,实现两个数据交换功能。调用该过程求随机生成的60-100间30个数中最大数和最小数。
解答:
Public Sub exer8413()
Dim a(1 To 30), t As Integer Dim i, j As Integer For i = 1 To 30
a(i) = Int(Rnd * 40 + 60) Debug.Print a(i) Next
For i = 1 To 30
For j = 1 To 30 - i
If a(j) > a(j + 1) Then
t = a(j): a(j) = a(j + 1): a(j + 1) = t End If Next j Next i
Debug.Print \最大值为\Debug.Print \最小值为\End Sub
14)输入两个正整数m和n,求其最大公约数和最小公倍数。 解答1:枚举法
Public Sub exer8414() Dim m, n As Integer Dim i, j, a, b As Integer
m = Val(InputBox(\输入一个值\n = Val(InputBox(\输入另一个值\'求最大公约数 If m > n Then
a = m: m = n: n = a End If
For i = 2 To m
If m Mod i = 0 And n Mod i = 0 Then
a = i End If Next i i = n
Do While True
If i Mod m = 0 And i Mod n = 0 Then b = i Exit Do End If i = i + 1 Loop
Debug.Print \最大公约数为\Debug.Print \最小公倍数为\End Sub
解答2:辗转相除法
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公约数的: 1. 若 r 是 a ÷ b 的余数, 则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公约数为 a。
两个数的最大公约数和最小公倍数有着下列关系:
最大公约数×最小公倍数=两数的乘积
Public Sub exer8414b() Dim m, n, t As Integer Dim a, b As Integer
m = Val(InputBox(\输入一个值\n = Val(InputBox(\输入另一个值\'求最大公约数 If m > n Then a = n: b = m Else
a = m: b = n End If
Do While True t = b Mod a If t = 0 Then Exit Do Else
b = a a = t End If
Loop
b = m * n / a
Debug.Print Str(m) & Str(n) & \最大公约数为\Debug.Print Str(m) & Str(n) & \最小公倍数为\End Sub
15)有M个人围成一圈,每人—个的编号(1,2,3,?,M),从第—个人数起,报到N时这个人就出圈,再继续数,报到第N个又出圈,出圈人的位置不再数,直到只剩下一个人为止,排出出圈人的顺序。
解答:
Public Sub exer8415() Dim m, n As Integer
Dim i, j, count, leave As Integer m = Val(InputBox(\输入人数\n = Val(InputBox(\输入报数\ReDim a(1 To m) As Integer For i = 1 To m a(i) = i Next i i = 1
count = 0 leave = 0
Do While leave < m If a(i) > 0 Then
count = count + 1 If count = n Then Debug.Print a(i) a(i) = 0 count = 0
leave = leave + 1 End If End If i = i + 1
If i > m Then
i = i Mod m + 1 i = i Mod m
End If Loop End Sub
Public Sub exer8415() Dim m, n As Integer
Dim i, j, count, leave As Integer m = Val(InputBox(\输入人数\n = Val(InputBox(\输入报数\
ReDim a(1 To m) As Integer For i = 1 To m a(i) = i Next i i = 1
count = 0 leave = 0
Do While leave < m count = 1
Do While count <= n Do Until a(i) > 0 i = i + 1
If i > m Then i = i Mod m End If Loop
Debug.Print count; a(i) If count = n Then Debug.Print a(i) a(i) = 0 End If
count = count + 1 i = i + 1
If i > m Then i = i Mod m End If Loop
leave = leave + 1 Loop End Sub