论坛: 编程破解 标题: 小弟有道C语言试题请教各位大哥,请各位大哥帮帮忙,谢谢了!(急) 复制本贴地址    
作者: kobe8369 [kobe8369]    论坛用户   登录
n(n>0)个人围坐一圈,从任何一个人开始,按1,2,3---n顺时针为每个人的编号.之后,从第s(s>0)个人开始按顺时针方向进行1---m(m>0)报数,报到m的人出圈,接着从下一个人继续1---m报数,报到m的人出圈,反复进行这种报数,直到所有人都出圈为止,问他们出圈的次序???
请各位朋友大哥帮帮忙,小弟感激不尽!!!

地主 发表时间: 04/01 19:21

回复: mars_hzg [mars_hzg]   论坛用户   登录
这是一道很经典的题目,有几种解法,比较好的是解法是链表,如栈也行,你自己看看相关内容吧。

B1层 发表时间: 04/02 19:04

回复: kobe8369 [kobe8369]   论坛用户   登录
晕~!!!
要是有看的,我就不上来发帖子了!!

B2层 发表时间: 04/02 19:17

回复: sunyue [sunyue]   论坛用户   登录
这里有一个用链表解决报数问题的代码例子,你可以看看 http://paddy.myrice.com/program/35.htm

B3层 发表时间: 04/03 15:01

回复: ltb [ltb]   论坛用户   登录
  白痴啊,,你,,我不是给你一个例子了吗》?

B4层 发表时间: 04/03 16:36

回复: kobe8369 [kobe8369]   论坛用户   登录
小弟不才,请大哥指点!!!

B5层 发表时间: 04/03 19:32

回复: SysHu0teR [syshunter]   版主   登录
链表实现比较麻烦,不如这个:
代码:
#include <stdio.h>
#define M 10
#define N 2

 int a[M],B[M];
 
 void climinate(int s,int m)
 {
  static n=0;
  int i,j,k;
 
  if (m==1)
       return;
 
  for(i=0,j=s,k=m-1;i<N;++i) {
            if(++j>k) j=0;
            }
            
     b[n++]=j?a[j-1]:a[k];
     
         if(j)
           for(i=--j;i<k;++j)
                 a[i]=a[i+1];
         eliminate(j,k);
  }
  
  void main(void)
  {
   int i;
  
   for(i=0;i<M;++i)
        a[i]=i+1;
   eliminate(0,M);
  
   for(i=0;i<M-1;++i)
       printf("%d ",b[i]);
    
    printf("%d\n",a[0]);
    
  }





B6层 发表时间: 04/04 12:36

回复: sunyue [sunyue]   论坛用户   登录
斑竹大人说得不错,递归函数确实也可以解决这个问题。

不过,斑竹大人,这是什么意思?
if(j)
for(i=--j;i<k;++j)
a[i]=a[i+1];

陷入了死循环的说?

B7层 发表时间: 04/04 13:39

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号