标题:也来发一个算法问题,其实是小学生的课后思考题.
只看楼主
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
结帖率:100%
已结贴  问题点数:30 回复次数:15 
也来发一个算法问题,其实是小学生的课后思考题.
也来发一个算法问题,其实是小学生的课后思考题.
我自己做起来很懵逼......
题目如下:
有九个同学,姑且给他们背后贴上纸条,纸条上编号分别为:A,B,C...I
让他们站成一个圆圈,由A同学开始,从1开始报数,
当有同学报"5"时,这个同学退出圈子.
这个同学之后的一个同学,重新开始从1开始报数,
当有同学报"5"时,这个同学退出圈子.周而复始...
......
直到剩下最后一个同学.
问:这个同学,背后纸条上编号为?

头脑里过一遍,或者纸面上写写画画,或许能找到答案,
但是我要的不是答案,而是过程,而且把这个过程,用程序语言描述出来.

程序运行后,希望输出这样的效果:
第1轮,E同学退出...
第2轮,A同学退出...
...
第?轮,?同学退出...至此,只剩下最后一位?同学.


欢迎各位用你们擅长的编程语言来求得答案,并展示过程.
搜索更多相关主题的帖子: 同学 思考 退出 算法 小学生 
2021-03-17 10:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
最后剩下的是四个同学,而不是剩下一个同学


[此贴子已经被作者于2021-3-17 11:12编辑过]


坚守VFP最后的阵地
2021-03-17 11:01
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
同学是站成一个圆圈的,所以当一个同学报到4,而他恰好在圈尾时,下一个同学自动按圆圈的法则,轮下去.
比如第6轮,B同学报4,那么就轮到F同学报5了.即便他在本轮已经报过1,此时也轮到他继续报数.

[此贴子已经被作者于2021-3-17 11:48编辑过]

2021-03-17 11:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
是不是这个意思


[此贴子已经被作者于2021-3-17 12:14编辑过]


坚守VFP最后的阵地
2021-03-17 11:56
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
回复 4楼 sdta
对的。
2021-03-17 13:39
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
我自己写的代码很笨重,主要是搜索下一开始位置时,是逐行扫描的,效率不高.
而且,我没有用数组,用的游标,因为在vfp环境下,我认为没有哪个数组能比游标效率更高了.
如果你用C,VB,java,Python,用数组/列表 这些模型,都可以讨论.
我的代码如下:
程序代码:
CLEAR 
CLOSE TABLES ALL 
CREATE CURSOR TT (ID i ,cname c(1) ,XH I ,ALIFE L,memo1 c(20)) 
LOCAL II AS Integer ,icnt as Integer ,ilc as Integer ,ilocate as Integer

* 建立初始模型,顺便模拟首轮排序。
FOR II = 65 TO 73
    INSERT INTO TT (ID,cname,XH,ALIFE) VALUES (II - 64,CHR(II) ,II - 64,.T.)
ENDFOR 

ilc =1  && 第?轮 
SELECT tt
COUNT FOR alife TO icnt 
DO WHILE icnt  > 1 
    IF ilc =1 THEN   && 确定开始位置
        ilocate=SetOrder(1) 
    ELSE 
        ilocate=SetOrder(ilocate) 
    ENDIF 
    * 处理本轮退出的.
    LOCATE FOR xh = 5 AND alife
    IF FOUND() THEN 
        REPLACE alife WITH .f. ,memo1 WITH '' + LTRIM(STR(ilc))  + '轮退出'
        ? '' + LTRIM(STR(ilc))  + '轮,' + cname + '同学退出...下一轮将从ID=' + ;
            LTRIM(STR(ilocate)) + '' + CHR(ilocate + 64) + '同学开始...'
    ELSE 
        ? 'Error ... 意外情况' 
    ENDIF 
    ilc = ilc + 1
    COUNT FOR alife TO icnt 
    IF icnt = 1 THEN 
        LOCATE FOR alife 
        ? '目前在第' + LTRIM(STR(ilc))  + '轮,只剩下' + cname + '同学一人,游戏结束.'
        EXIT 
    ENDIF 
ENDDO 

FUNCTION  SetOrder(startxh) as Integer
* 参数:1开始的位置 
LOCAL ncnt as Integer
LOCAL ilot as Integer 
LOCAL lfund as Boolean 
    SELECT tt
    REPLACE xh WITH 0 FOR  alife
    COUNT FOR  alife TO ncnt
    IF ncnt >1 THEN 
        IF startxh > RECCOUNT() THEN 
            GO 1
        ELSE 
            GO startxh            
        ENDIF 
        ii = 1 
        DO WHILE ii< 6 
            IF  alife THEN 
                REPLACE xh WITH ii 
                ii = ii + 1
                SKIP 
                IF  EOF() THEN 
                    GO 1
                ENDIF 
            ELSE 
            * 后面几轮,会进入这个分支
                SKIP 
                IF  EOF() THEN 
                    GO 1
                ENDIF                     
            ENDIF 
        ENDDO 
        * 返回下次应开始的位置:
        LOCATE FOR xh = 5 AND alife 
        IF FOUND() THEN 
            ilot = id  && 暂时的
            DO WHILE lfund  =.f. 
                IF alife AND xh<> 5 THEN 
                    ilot = id 
                    lfund  =.t. 
                ELSE 
                    SKIP 
                    IF EOF() THEN 
                        GO 1
                    ENDIF         
                ENDIF 

            ENDDO 
            RETURN ilot 
        ENDIF     
    ELSE 
    * 说明只剩下最后一个了,不再循环,因为没有意义了.
        RETURN 0 
    ENDIF 

ENDFUNC 

2021-03-17 15:49
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
学习啦,谢谢!
2021-03-17 19:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
编程经典“猴子选大王”问题
试试用数组元素轮换

程序代码:
fun(9, 5)
RETURN

FUNCTION fun(n, m)
    DIMENSION arr[9]
    ?
    FOR i=1 TO n
        arr[i] = CHR(i+64)
        ?? " "+arr[i]
    ENDFOR
    DO WHILE n > 1
        FOR i=1 TO m-1
            a = arr[1]
            ADEL(arr,1)
            arr[n] = a
        ENDFOR
        ADEL(arr,1)
        n = n - 1
        **DIMENSION arr[n]
        ? 
        FOR i=1 TO n
            ?? " "+arr[i]
        ENDFOR
    ENDDO
ENDFUNC


[此贴子已经被作者于2021-3-17 22:03编辑过]

收到的鲜花
  • sdta2021-03-18 00:09 送鲜花  4朵   附言:经典问题,经典代码
2021-03-17 21:59
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
@吹水版主,高!学习啦,谢谢!
2021-03-18 05:53
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
反过来玩又如何,如:
设:有一个乱序的9个同学队列,让他们站成一个圆圈
从第1个同学开始报数,当有同学报"5"时,这个是A同学,出队
这个A同学之后的一个同学,重新开始从1开始报数,当有同学报"5"时,这个是B同学,出队
周而复始.........
直到最后一个是I同学,出队
最后按出队的顺序就是9个同学代号的顺序队列: A B C D E F G H I
求:这个乱序的9个同学队列?


[此贴子已经被作者于2021-3-18 13:59编辑过]

2021-03-18 10:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505144-1-1.html




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

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