题目:
 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,不知对不对啊!!!

解决方案 »

  1.   

    i,j,k这三个变量没定义 也能运行得出17?呵呵
      

  2.   

    我也是手算的,应该是11。。
    这题目最好用数据结构的知识来做,无奈上大学的时候只顾着喝酒,高数没学好数据结构现在是一片空白了。惭愧啊。
    下面是我生拼硬凑的一种另类方法,你参考一下吧如果有时间,我再修改一下,根据这种方法写个通用的(即有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
      

  3.   

    Private Sub Form_Load()
        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,不知道对不对
      

  4.   

    ^_^,wsdst497(虎翼),我跟你的思路是一样的,可是,我编的有问题,^_^
      

  5.   

    '通用版本
    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