回 帖 发 新 帖 刷新版面

主题:每月一题

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

回复列表 (共7个回复)

沙发

CLS
INPUT n, m
DIM a(n)
FOR i = 1 TO n
a(i) = 1
NEXT
s = 0: p = 0
20 FOR i = 1 TO n
s = s + a(i)
IF s <> m THEN 10
a(i) = 0: s = 0: p = p + 1
IF p = n THEN PRINT i: END
10 NEXT i
GOTO 20

板凳

结果比较非常准确,不过还是要提出几点缺点:
1、GOTO用得太多,程序结构不太好,小程序还行,写大点的程序很容易乱。
2、建议在各个结构中使用缩进,增加可读性
3、建议变量用些有一定意义的单词
总体来讲结果运行正确,但不知道考没考虑报数到三的人是要离开圆圈的,不知道是有意这么设计还是你设计的程序的结构能碰巧解决这个问题。
写的不错,比我厉害,希望继续努力!

3 楼

一楼的程序完全正确,但有点抄书的嫌疑,典型的八十年代教材版式.
如果是我错怪了的,请原谅.

Function mn(n, m)
ReDim a(n)
Do
    For i = 1 To n
        s = s + 1 - a(i)
        If s = m Then
            a(i) = 1
            s = 0
            p = p + 1
            If p = n Then Exit Do
        End If
    Next
Loop
mn = i
End Function


片面强调代码篇幅好像并不能代表什么,你看看能看得明白是怎么回事吗?
input n,m:Dim a(n):Do:For i=1 To n
s=s+1-a(i):If s=m Then a(i)=1:s=0:p=p+1:If p=n Then Exit Do
Next:Loop:Print i

我总觉得中间是不是有更直接的函数,否则在计算n=10000,m=350的时候会非常漫长.
以下是当m=3时,n=1 to 60的结果:147258369的频率比较异常.
1  2  2  1  4  1  4  7  1  4  7  10  13  2  5  8  11  14  17  20  2  5  8  11  14  17  20  23  26  29  1  4  7  10  13  16  19  22  25  28  31  34  37  40  43  46  2  5  8  11  14  17  20  23  26  29  32  35  38  41

4 楼

以下程序是当m=3的时候总结出来的函数.
比单纯的循环快得多,当n越大时越显优势差距.
只是经验总结,你要问我为什么,我还真的不懂得怎样解释.

Print m3(1000000)   '结果应该是: 637798 

Function m3(n)
a = 1
s = 1
Do While a < n
Select Case a - s
Case 0
    a = a + 1
    s = 2
Case 1
    a = a + 1
    s = 1
Case Else
    b = (a - s) \ 2
    a = a + b
    s = s + 3 * b
End Select
Loop
m3 = s - 3 * (a - n)
End Function

5 楼

本来上午就要完成的,
被老婆拉出去了,
回来才写出来
结果可以验证一下,
我只是随便挑了几个数来试试,都是正确的,
完全是按照形而上学的片面经验而写出来的东西,
有兴趣大家挑战一下.
虽然完全是自己想像写出来的东西,也算是一个小小的成就,值得自我陶醉一下.
至于其中的奥妙,我也不懂.

print m3(100000000,9999)     '42723462 就怕你们的电脑无法验证.

Function m3(n, m)
a = 1
s = 1
m1 = m - 1
Do While a < n
    b = a - s
    If b < m1 Then
        a = a + 1
        s = m1 - b
        If s > a Then
           s = s Mod a
           If s = 0 Then s = a
        End If
    Else
        b = (a - s) \ m1
        a = a + b
        s = s + m * b
    End If
Loop
m3 = s - m * (a - n)
End Function

6 楼

写的都很好,可惜最多能加50分,加不了分了

7 楼

很佩服moz

我来回复

您尚未登录,请登录后再回复。点此登录或注册