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

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

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


欢迎各位用你们擅长的编程语言来求得答案,并展示过程.
搜索更多相关主题的帖子: 同学 思考 退出 算法 小学生 
2021-03-17 10:44
厨师王德榜
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
厨师王德榜
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



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




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

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