| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2043 人关注过本帖, 1 人收藏
标题:问题请教 关于17人围圈问题!
只看楼主 加入收藏
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
注意你的题的编号是0、1、2、……、16 (从0开始,不是从1 开始的,否则的话,答案就是11)
下面附上我的演算:(M--循环报数--退出即报数0,E--退出--退出则为0,B--编号)
B   0    1    2    3    4    5    6    7    8    9    10    11   12    13    14    15    16
    1    2    3    4    5    6    7    8    9    10   11    12   13    14    15    16    17
E   1    2    0    4    5    0    7    8    0    10   11    0    13    14    0     16    17
M  18    19   0    20   21   0    22   23   0    24   25    0    26    27    0     28    29
E   0    19   0    20   0    0    22   23   0    0    25    0    26    0     0     28    29
M   0    30   0    31   0    0    32   33   0    0    34    0    35    0     0     36    37
E   0    0    0    31   0    0    32   0    0    0    34    0    35    0     0     0     37
M   0    0    0    38   0    0    39   0    0    0    40    0    41    0     0     0     42
E   0    0    0    38   0    0    0    0    0    0    40    0    41    0     0     0     0
M   0    0    0    43   0    0    0    0    0    0    44    0    45    0     0     0     0
E   0    0    0    43   0    0    0    0    0    0    44    0    0     0     0     0     0
M   0    0    0    46   0    0    0    0    0    0    47    0    0     0     0     0     0
E   0    0    0    46   0    0    0    0    0    0    47    0    0     0     0     0     0
M   0    0    0    48   0    0    0    0    0    0    49    0    0     0     0     0     0
E   0    0    0    0    0    0    0    0    0    0    49    0    0     0     0     0     0
答案确实是10号!
再仔细演算一遍吧!


[ 本帖最后由 promising 于 2009-9-3 16:00 编辑 ]

向前走着……
2009-09-02 18:44
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
我的回复在第二页,,上面啊

向前走着……
2009-09-02 18:45
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:4211
专家分:28888
注 册:2009-4-8
收藏
得分:0 
以下是引用wwj1860在2009-9-1 00:07的发言:

有这样一个程序题 万望高手不吝赐教!有17个人围成一圈(编号为0~16),第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后生一个人为止,问此人原来的位置号是多少? 请教了!

程序你不是有了吗?你只问此人原来的位置号是多少?4#不是说11了吗?

无知
2009-09-02 18:50
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
以下是引用wwj1860在2009-9-2 05:28 PM的发言:
根据草纸上演算结果 应该是11才对啊 而不应该是10 望回复!
我的基本思路是这样的 先把1到17通过循环赋值给数组a()然后再通过循环开始除去被三整除的数 每当除去一个数 就把该数后面的数依次向前移动一位,这样就去 ...
你的思路我想过,但是我认为行不通。
首先,你的思路很难找到一个变量使它等于原始编号!
因为你的数组元素在往前移。最后,天知道,初始时的位置号是什么。
然后,假设退出的人对应的数组元素的值,令其为0
(我不知道能否删除数组元素个数,如啊a(16)到啊(11)等,来改变数组长度。我假设它不能的话)
如啊a(3),a(4)前移后啊a(5),a(6)都为0
  也即是说,相邻的从1个变为2个,5个,等等
我认为很难找出一个通用的循环使它对相邻0的个数变化的数组适用,来使数组元素的值前移!
你的思路似乎要重新定义老数组,而且改变其元素个数,这似乎办不到吧。我认为也难用循环定义长度不同的数组吧!

 浅薄的观点,请指教!……

[ 本帖最后由 promising 于 2009-9-2 19:13 编辑 ]

向前走着……
2009-09-02 19:04
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
帮我想想我的问题吧
     《 鼠标形态的改变》
promising

向前走着……
2009-09-02 19:20
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:10 
这是我写的代码,包括 DEBUG 在内。
Private Sub Command1_Click()
Cls
Dim i As Long
Dim w(1 To 17) As Long

For i = 1 To 17
    w(i) = 1
Next i

Dim j As Long           '记录当前位置
Dim k As Long           '计算走过的人
Dim m As Long           '查找的人
Dim n As Long           '还剩多少人

j = 0                   '从第1个人点起,因为第一个人要算,所以从0起
Do
    k = 0               '重新点过人
    m = j               '确定从那个人点起
    Do While k < 3
        m = m + 1       '向后点一位
        If m > 17 Then m = m - 17           '点到最后返回第一个
        If w(m) > 0 Then        '如果该位置有人,则表示点到人
            k = k + 1
        End If
        
        n = 0                   '统计剩多少人
        For i = 1 To 17
           n = n + w(i)
        Next i
        If n < 2 Then           '如果剩下的人不到2人,则表示不用再点了
            Exit Do
        End If
    Loop
   
    If k = 3 Then               '如果点到了3人,
        w(m) = 0                '把该点的人去掉
        j = m                   '下次从该点算起
    Else
        Exit Do                 '如果没点到3人,说明是剩余人不足而退出的循环,点人结束
    End If
   
    For i = 1 To 17             '输出每步的结果
        Print w(i);
    Next i
    Print m                     '输出每步点到的人的编号
Loop


For i = 1 To 17                 '输出最终结果,剩余谁
    If w(i) > 0 Then
        Print i
        Exit For               '因为只有一个结果,所以这句建议加上,退出循环
    End If
Next i

End Sub

运行的DEBUG结果如下:
 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 取走
---------------------------------------
 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 6
 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 9
 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 12
 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 15
 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1
 0 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 5
 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 10
 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 14
 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 2
 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 8
 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 16
 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 7
 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 17
 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 13
 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 4
 11


授人于鱼,不如授人于渔
早已停用QQ了
2009-09-03 09:37
zhuyongxing
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:234
专家分:482
注 册:2009-8-5
收藏
得分:0 
编号是10.第11个人对着呢
2009-09-03 10:45
wei855198
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:228
专家分:944
注 册:2009-4-24
收藏
得分:0 
有意思也挺烦琐

护肤小店 http://mina2010.
靓装小店 http://liangliyizu2010.
2009-09-03 15:19
promising
Rank: 3Rank: 3
来 自:上海
等 级:论坛游侠
帖 子:87
专家分:147
注 册:2009-8-31
收藏
得分:0 
我把我的程序再细细解释一遍:
Option Explicit

Private Sub Form_Click()
'声明a()数组,存贮17个自然数 (1)
Dim a(16) As Integer, i As Integer, m As Integer, s As Integer, t As Integer

m = 17

For i = 0 To 16
a(i) = i + 1
Next i

Do While s <> 1
'检验是否为3的倍数 (2)
For i = 0 To 16
If a(i) Mod 3 = 0 Then
a(i) = 0            '是3 的倍数则报数0,即是退出
Else
t = i               '存贮每一个不是3的倍数的数的编号,最后一个即是所求的答案(注意编号从0开始,不是从1开始)
End If
Next i
'循环报数 (3)
For i = 0 To 16
If a(i) <> 0 Then
m = m + 1           ,先前m被赋值为17,即第一个a(i)被赋值为18,以后以此类推!
a(i) = m
End If
Next i
'检验是否只剩下最后一个数 (4)
s = 0
For i = 0 To 16
If a(i) <> 0 Then
s = s + 1           ’计数器记录不是0的数的个数
End If
Next i
Loop
Print "编号为" & t
Print "Last number " & "(编号)" & t & "is " & a(t) - 1      '之所以打印a(t) - 1而不是a(t) ,
                                                            ’是因为检验是否为3的倍数 (2) 之后,
                                                            '又循环报数 (3) 了一次,即惟一一个不是0的数的值
                                                            '又加了1(多报了一次数)。
End Sub

仔细再检查一遍吧!

算了,真的不想再回复了!……就这样了吧!

向前走着……
2009-09-03 16:24
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:4 
回复 楼主 wwj1860
程序代码:
Private Sub Form_Load()
  Debug.Print Get3Num(17)
End Sub
Private Function Get3Num(ByVal Num1 As Long) As Long
  Dim I As Long, J As Long, K As Long, L As Long
  Dim R() As Long
 
  On Error Resume Next
 
  If Num1 < 1 Then Exit Function
  Num1 = Num1 - 1
  ReDim R(Num1)
  For I = 0 To Num1
    R(I) = I + 1
  Next I
   
  J = 0: K = Num1: I = 0
  Do While True
    If R(I) Then
      J = J + 1: L = R(I)
      If J Mod 3 = 0 Then
        R(I) = 0
      End If
    Else
      K = K - 1
      If K < 0 Then
        Erase R
        Get3Num = L
        Exit Function
      End If
    End If
   
    If I = UBound(R) Then
      K = Num1: I = 0
    Else
      I = I + 1
    End If
  Loop
End Function

VB QQ群:47715789
2009-09-03 18:07
快速回复:问题请教 关于17人围圈问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025600 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved