vb版约瑟夫算法
题目就是:n个人围成一圈报数,数到m的人出列,下一次从m的下一个人开始报数再到m后
出列,直到最后一个人也出列,并且打印出每次出列的人是谁
ben1222...又到处发帖...那我也再帖一次...看看这个算法是否更好 集合版:
Private Sub Command1_Click()
Dim a As New Collection
Dim n As Integer, m As Integer
m = Val(Text2.Text)
For n = 1 To Val(Text1.Text)
a.Add CStr(n)
Next
n = 0
While a.Count > 0
n = ((m + n - 1) Mod a.Count) + 1
Debug.Print a.Item(n)
a.Remove n
n = n - 1
Wend
End Sub
书林跋涉:对象链
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
版
我记得大学时候用约瑟夫环算法求过全排列
今天有空改成vb的了
大家帮忙测试一下速度吧
:)
clsnode.cls 如下
Public Property Let data(ByVal vData As Long)
m_Value = vData
End Property
Public Property Get data() As Long
data = m_Value
End Property
Public Property Let nextnode(ByVal vData As ClsNode)
Set node = vData
End Property
Public Property Get nextnode() As ClsNode
Set nextnode = node
End Property
主要代码如下:
Private ListNode() As ClsNode Private Sub Command1_Click() Dim k As Long
Dim sT!
sT = Timer
k = Val(Text1.Text)
Call AllRank(k)
MsgBox "总用时:" & Format(Timer - sT, "0.000") & "s"
End Sub
Private Sub AllRank(ByVal n As Long) Dim i As Long, j As Long, k As Long, l As Long
If n > 12 Or n < 1 Then MsgBox "太大了": Exit Sub ReDim ListNode(1 To n) As ClsNode For i = 1 To n
Set ListNode(i) = New ClsNode
ListNode(i).data = i
Next
''''''''''''''''''''''''''
l = factorial(n - 1)
For i = 1 To n
For j = 1 To l
Josephus n, i, j
Next
Next
'''''''''''''''''''''''''''' For i = 1 To n
Set ListNode(i) = Nothing Next
End Sub
Private Function factorial(ByVal n As Long) As Long
Dim sum As Long, i As Long
sum = 1
For i = 1 To n
sum = sum * i
Next
factorial = sum
End Function
Private Sub Josephus(ByVal n As Long, ByVal start As Long, ByVal m As Long)
Dim i As Long, Prior As Long Dim p As ClsNode, ptr As ClsNode Dim count As Long, t As Long '建立循环链表
For i = 1 To n - 1
ListNode(i).nextnode = ListNode(i + 1)
Next
ListNode(n).nextnode = ListNode(1)
'总结点数
count = n
'找开始报数的对应结点
Set p = ListNode(start) '找当前结点的直接前趋结点
If start > 1 Then
Prior = start - 1
Else
Prior = n
End If
Set ptr = ListNode(Prior)
'Debug.Print vbCrLf Do While count > 0
t = (m - 1) Mod count
For i = 1 To t
Set ptr = p
Set p = p.nextnode
Next
'Debug.Print p.data,
'Me.Print p.data,
ptr.nextnode = p.nextnode
count = count - 1
Set p = ptr.nextnode Loop
'Debug.Print
'Me.Print
End Sub
bz3zwy:数组链表版
Option Explicit
Private Sub Command1_Click() Const m% = 8
Dim a%(1 To m)
Dim i%, j%, n%, p%
For i = 1 To m - 1: a(i) = i + 1: Next
a(m) = 1
n = InputBox("请输入出列数字n")
p = m
For i = 1 To m
For j = 1 To n - 1: p = a(p): Next
Print a(p);
a(p) = a(a(p))
Next
End Sub