题目:
17人围成一圈,编号为1,2,3,…,17,从1号开始报数,报到3的倍数的人离开,一直数下去,直到最后剩下1人,求此人的编号。我的程序:Private Sub Form_Click()
Dim n As Integer
Dim total As Integer
n = 0
total = 0
Dim a(1 To 17) As Integer 'a(i)为原数组,对a(i)进行操作
Dim b(1 To 17) As Integer 'b(i)为标记位,用来判断条件用
For i = 1 To 17
a(i) = 1 '初始化a(i),b(i)均为1,表示该位未被删除
b(i) = 1
Next i
Do While total <> 1
For i = 1 To 17
total = 0
Do While a(i) = 0 '如果a(i)已经被删除,不作任何操作,跳到下一个进行操作
i = i + 1
Loop
a(i) = n + 1 '如果a(i)未被3整除,则a(i)的值依次加1
n = n + 1
If a(i) Mod 3 = 0 Then '如果a(i)能被3整除,则,a(i),b(i)置0,表示该位置被删除
a(i) = 0
b(i) = 0
End If
For j = 1 To 17 '统计是否还有一个未被删除
total = total + b(j)
Next j
If total = 1 Then 'total=1,表示还剩最后一个未被删除
For k = 1 To 17 '找到该数的位置,输出
If b(k) = 1 Then
Print k
End If
Next k
End If
Exit For
Next i
Loop
End Sub我的结果是17,不知对不对啊!!!
17人围成一圈,编号为1,2,3,…,17,从1号开始报数,报到3的倍数的人离开,一直数下去,直到最后剩下1人,求此人的编号。我的程序:Private Sub Form_Click()
Dim n As Integer
Dim total As Integer
n = 0
total = 0
Dim a(1 To 17) As Integer 'a(i)为原数组,对a(i)进行操作
Dim b(1 To 17) As Integer 'b(i)为标记位,用来判断条件用
For i = 1 To 17
a(i) = 1 '初始化a(i),b(i)均为1,表示该位未被删除
b(i) = 1
Next i
Do While total <> 1
For i = 1 To 17
total = 0
Do While a(i) = 0 '如果a(i)已经被删除,不作任何操作,跳到下一个进行操作
i = i + 1
Loop
a(i) = n + 1 '如果a(i)未被3整除,则a(i)的值依次加1
n = n + 1
If a(i) Mod 3 = 0 Then '如果a(i)能被3整除,则,a(i),b(i)置0,表示该位置被删除
a(i) = 0
b(i) = 0
End If
For j = 1 To 17 '统计是否还有一个未被删除
total = total + b(j)
Next j
If total = 1 Then 'total=1,表示还剩最后一个未被删除
For k = 1 To 17 '找到该数的位置,输出
If b(k) = 1 Then
Print k
End If
Next k
End If
Exit For
Next i
Loop
End Sub我的结果是17,不知对不对啊!!!
解决方案 »
- 空行显示的问题 续
- 如何在wsc文件中调用Wscript对象
- VB+sql中删除Recordset对象的唯一一条记录出错
- 在用webbrowser提取表格中的数据时,遇到的问题
- 求助,弹出的框体B如何获得框体A中剪切板的图像
- 初学者问题:重装系统以后自定义控件不能用了:(
- 有没有象类似于ACDsee软件窗口的控件,100分
- 在局域网内如何检测某台电脑是否开机?
- 用什么api 获得 系统当前活动窗体的句柄?
- 请问在VB中用ADO查询数据库的日期问题
- 请问VB里如何实现text文本框只能输入数字和退格键,输入其他的数据光标定格并且报错
- 千分只求一解,困扰了几天了,vb写的ocx,连接数据库,在vb中没有任何问题,在ie里面,iis环境下就不行了,为什么?
这题目最好用数据结构的知识来做,无奈上大学的时候只顾着喝酒,高数没学好数据结构现在是一片空白了。惭愧啊。
下面是我生拼硬凑的一种另类方法,你参考一下吧如果有时间,我再修改一下,根据这种方法写个通用的(即有M个人围成一堆,每数N个人就离开,求最后那个人):
Private Sub Command1_Click()
Dim s As String
Dim a(1 To 17) As Integer
Dim cnt As Long
s = "11111111111111111"
For i = 1 To 17
a(i) = 0
Next
k = 0
j = 1
Do Until InStr(s, "1") = 0
x = InStr(s, "1")
k = k + 1
cnt = cnt + x
s = Right(s, 17 - x) & Left(s, x)
If k = 3 Then
s = Left(s, 16) & "0"
If cnt Mod 17 = 0 Then
a(j) = 17
Else
a(j) = cnt Mod 17
End If
j = j + 1
k = 0
End If
Loop
For i = 1 To 17
Print a(i)
Next
End Sub
Dim a(1 To 17) As Integer '人的位置,和报的数
Dim b(1 To 17) As Boolean '标记,false为死掉,true为活着
Dim num As Integer '报的数
Dim i As Integer
Dim j As Integer
For i = 1 To 17 '初始化(全为活着)
b(i) = True
Next i
num = 1
i = 1
temp = 17 '剩的人数
Do
If b(i) = True Then
a(i) = num '第i个人,所报的数
If num Mod 3 = 0 Then
b(i) = False
temp = temp - 1 '剩的人数减一
End If
If temp = 1 Then '只剩一个人时
For j = 1 To 17 '看哪个人活着
If b(j) = True Then MsgBox j '显示编号
Next j
Exit Do
End If
num = num + 1 '所报的数字
End If
i = i + 1 '下一个人
If i > 17 Then i = 1
Loop
End Sub结果11,不知道对不对
Private Sub Command1_Click()
Dim m, n As Integer '设总共有m个人,数到n的倍数的人离开
Dim s As String
Dim a() As Integer '记录每次离开的人的编号
Dim cnt As Long '用来计算步数
'赋值,以你举的例子为例,m=17,n=3
m = 5
n = 3
ReDim a(1 To m)
s = String(m, "1") '初始化源字符串
k = 0
j = 1
'开始计算
Do Until InStr(s, "1") = 0
x = InStr(s, "1")
k = k + 1
cnt = cnt + x
s = Right(s, m - x) & Left(s, x)
If k = n Then
s = Left(s, m - 1) & "0"
If cnt Mod m = 0 Then
a(j) = m
Else
a(j) = cnt Mod m
End If
j = j + 1
k = 0
End If
Loop
'打印结果
For i = 1 To m
Print a(i)
Next
End Sub