| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2150 人关注过本帖
标题:也来发一个算法问题,其实是小学生的课后思考题.
只看楼主 加入收藏
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2202
专家分:3862
注 册:2007-4-27
收藏
得分:10 
五号签命中问题研究.rar (1.27 KB)

程序代码:
*!*      http://bbs.bccn.net/thread-505144-1-1.html  
*!*     论坛上狐友“厨师王德榜”发的题目
   
*!*    也来发一个算法问题,其实是小学生的课后思考题.
*!*    我自己做起来很懵逼......

*!*    题目如下:
*!*    有九个同学,姑且给他们背后贴上纸条,纸条上编号分别为:A,B,C...I
*!*    让他们站成一个圆圈,由A同学开始,从1开始报数,
*!*    当有同学报"5"时,这个同学退出圈子.
*!*    这个同学之后的一个同学,重新开始从1开始报数,
*!*    当有同学报"5"时,这个同学退出圈子.周而复始...
*!*     ......
*!*    直到剩下最后一个同学.
*!*    问:这个同学,背后纸条上编号为?

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

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

*!*    欢迎各位用你们擅长的编程语言来求得答案,并展示过程. 
*!*    时间:2021-3-17
    CLEAR 
    CLEAR ALL 
    SET SAFETY OFF 
    
    PUBLIC kz,nRecc,nYs
    CLOSE DATABASES
    
    SELECT * from ys INTO TABLE jgcl
    SELECT * from ys WHERE 1=2 INTO TABLE qhpx
    
    kz=.T.
    DO WHILE kz=.T.
      SELECT jgcl
      GO top
      nRecc=RECCOUNT()
      DO CASE
        CASE nRecc>=5
          GO 5
          COPY TO ls NEXT 1
          COPY TO ls1 FOR RECNO()>5
          COPY TO ls2 FOR RECNO()<5
          SELECT qhpx
          APPEND FROM ls
          SELECT jgcl
          ZAP
          APPEND FROM ls1
          APPEND FROM ls2 
          
        CASE nRecc<5
          IF nRecc=1
            kz=.F.
          ELSE 
            nYs=MOD(5,nRecc)
            IF nRecc>nYs
              GO nYs
              COPY TO ls NEXT 1
              COPY TO ls1 FOR RECNO()>nYs
              COPY TO ls2 FOR RECNO()<nYs
              SELECT qhpx
              APPEND FROM ls
              SELECT jgcl
              ZAP
              APPEND FROM ls1
              APPEND FROM ls2 
            ELSE
              nYs=MOD(nYs,nRecc)
              GO nYs
              COPY TO ls NEXT 1
              COPY TO ls1 FOR RECNO()>nYs
              COPY TO ls2 FOR RECNO()<nYs
              SELECT qhpx
              APPEND FROM ls
              SELECT jgcl
              ZAP
              APPEND FROM ls1
              APPEND FROM ls2 
            ENDIF   
          ENDIF 
      ENDCASE 
    ENDDO 
    SELECT qhpx
    GO top
    SCAN
      ? "第"+ALLTRIM(STR(RECNO()))+"位出局的同学是: " + yxrdm
    ENDSCAN 
    SELECT jgcl
    ? "最后剩下的同学是:  "+yxrdm
    
    CLOSE DATABASES 
    RETURN 
    

只求每天有一丁点儿的进步就可以了
2021-03-18 11:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏
得分:0 
以下是引用吹水佬在2021-3-18 10:33:41的发言:

反过来玩又如何,如:
设:有一个乱序的9个同学队列,让他们站成一个圆圈
从第1个同学开始报数,当有同学报"5"时,这个是A同学,出队
这个A同学之后的一个同学,重新开始从1开始报数,当有同学报"5"时,这个是B同学,出队
周而复始.........
直到最后一个是I同学,出队
最后按出队的顺序就是9个同学代号的顺序队列: A B C D E F G H I
求:这个乱序的9个同学队列?

目测:
  x x x x A x x x x
  B x x x A x x x x
  B x x x A x C x x
  B x x D A x C x x
  B x E D A x C x x
  B x E D A F C x x
  B x E D A F C x G
  B H E D A F C x G
  B H E D A F C I G
2021-03-18 15:39
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2202
专家分:3862
注 册:2007-4-27
收藏
得分:0 
程序代码:
    CLEAR 
    CLEAR ALL 
    SET SAFETY OFF 
    
    PUBLIC kz,nRecc,nYs     &&& kz-循环的控制,nRecc-加工处理表的记录数,nYs-余数 
    CLOSE DATABASES
    
    SELECT * from ys INTO TABLE jgcl    &&& YS.DBF表二个字段(ID,YXRDM)
    SELECT * from ys WHERE 1=2 INTO TABLE qhpx
    
    kz=.T.
    DO WHILE kz=.T.
      SELECT jgcl
      GO top
      nRecc=RECCOUNT()
      DO CASE
        CASE nRecc>=5
          GO 5
          COPY TO ls NEXT 1
          COPY TO ls1 FOR RECNO()>5
          COPY TO ls2 FOR RECNO()<5
          SELECT qhpx
          APPEND FROM ls
          SELECT jgcl
          ZAP
          APPEND FROM ls1
          APPEND FROM ls2 
          *--游戏人数5人以上,直接将第5个取出,后队变前队
        CASE nRecc<5
          IF nRecc=1
            kz=.F.
          ELSE 
            nYs=MOD(5,nRecc)
            IF nRecc>nYs
              GO nYs
              COPY TO ls NEXT 1
              COPY TO ls1 FOR RECNO()>nYs
              COPY TO ls2 FOR RECNO()<nYs
              SELECT qhpx
              APPEND FROM ls
              SELECT jgcl
              ZAP
              APPEND FROM ls1
              APPEND FROM ls2 
            ELSE
              nYs=MOD(nYs,nRecc)
              GO nYs
              COPY TO ls NEXT 1
              COPY TO ls1 FOR RECNO()>nYs
              COPY TO ls2 FOR RECNO()<nYs
              SELECT qhpx
              APPEND FROM ls
              SELECT jgcl
              ZAP
              APPEND FROM ls1
              APPEND FROM ls2 
            ENDIF   
          ENDIF
          *--少于5人,需要进行转圈,通过取余数来确定 
      ENDCASE 
    ENDDO 
    SELECT qhpx
    APPEND FROM jgcl
    REPLACE yxrdm WITH CHR(64+RECNO()) all
    SELECT * from qhpx ORDER BY id INTO TABLE ysrand
    SELECT ysrand
    BROWSE
    
    CLOSE DATABASES 
    RETURN 

还是11楼那个附件里的 YS.DBF 使用。

只求每天有一丁点儿的进步就可以了
2021-03-19 08:22
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2202
专家分:3862
注 册:2007-4-27
收藏
得分:0 
程序代码:
     ****************
     * 让出圈后的排序符合要求
     ****************
     CLEAR 
     SET SAFETY OFF     
     CLOSE DATABASES 
     CREATE TABLE ys (id n(2),yxrdm c(1))
     FOR i=1 TO 9
       APPEND BLANK
       REPLACE id WITH i
       REPLACE yxrdm WITH CHR(i+64)
     ENDFOR 
     COPY TO ks
     USE ks
     REPLACE yxrdm WITH '' ALL 
     CLOSE DATABASES 
     *----
     nRecn=1
     SELECT 0
     USE ys
     SELECT 0
     USE ks
     SELECT ys
     SCAN
       sn=0
       SELECT ks
       GO nRecn
       kz=.T.
       DO WHILE kz
         IF EMPTY(ks.yxrdm)
           sn=sn+1
           IF sn=5
             nRecn=RECNO()
             EXIT 
           ENDIF 
           SKIP 1
           IF EOF()
             GO TOP 
           ENDIF
         ELSE 
           SKIP 1
           IF EOF()
             GO TOP 
           ENDIF   
         ENDIF 
       ENDDO 
       REPLACE ks.yxrdm WITH ys.yxrdm
       SELECT ys
     ENDSCAN 
     SELECT ks
     BROWSE 
     RETURN 

只求每天有一丁点儿的进步就可以了
2021-03-19 09:22
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9808
专家分:26987
注 册:2012-2-5
收藏
得分:10 
程序代码:
LOCAL la[9]
FOR lnj = 1 TO 9
    la[lnj] = CHR(64 + 9 - lnj + 1)
ENDFOR
lnCnt = 9
? "出局顺序:"
? 
DO WHILE lnCnt > 0
    FOR lnj = 1 TO 5
        IF EMPTY(la[9])
            lnj = lnj - 1
        ENDIF 
        IF lnj = 5
            ?"第 " + TRANSFORM(9 - lnCnt + 1) + " 轮 同学" + la[9]
            la[9] = ""
        ENDIF 
        c1 = la[9]
        AINS(la, 1)
        la[1] = c1
    ENDFOR
    lnCnt = lnCnt - 1
ENDDO 

坚守VFP最后的阵地
2021-03-22 09:37
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9808
专家分:26987
注 册:2012-2-5
收藏
得分:0 
针对楼主说的9个人问题,也可以用截取字符的办法完成这个算法,速度还是不错的,有兴趣的朋友可以试着写段代码

坚守VFP最后的阵地
2021-03-28 10:00
快速回复:也来发一个算法问题,其实是小学生的课后思考题.
数据加载中...
 
   



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

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