A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 dawei233 于 2014-7-26 20:26 编辑

测试题已经上交了,但是那道耶稣的测试题,一直没什么思路。
1、围成一个圈,在程序要怎么控制;
2、要有一个变量来控制那些已经被剔除出去,也就是被点到3的人;
3、是不是每次被剔除出去之后,都要重新生成一个新的圈圈?

感觉好像需要用到数组,但是不知道要怎么控制。
知道的童鞋麻烦帮帮忙,可以不贴代码,说说思路也行。谢谢。

7 个回复

倒序浏览
定义一个int数组,长度等于人数,这样下标就表示人的编号。没被剔除的,值为1,被剔除的,值为0,这样就可以区分,并始终使用一个数组。
开始数人,这个过程设计为一个死循环,需要三个变量:一是代表数组下标。二是记录是否数到3。三是记录数组中还有多少人未被剔除,当还剩1人时退出循环。前两个变量都涉及“绕圈”,也就是从0开始自增到一个目标数后重新归0。
回复 使用道具 举报
本帖最后由 rocki 于 2014-7-26 19:02 编辑
  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. int main(int argc, const char * argv[])
  4. {
  5.     //声明报数函数
  6.     int  numberOff(int n,int m);
  7.    
  8.     //调用报数函数并打印叛徒编号,
  9.     printf("叛徒是NO.%d\n",numberOff(15,3));
  10.    
  11.     return 0;
  12. }
  13. //n代表人数,m代表报数
  14. int  numberOff(int n,int m)
  15. {
  16.     int count = n;//count代表圈子内剩余的人数
  17.    
  18.     int flag=0;//当前报数
  19.    
  20.     int i,j;//i表示当前报数人下标
  21.    
  22.     int *a,traitor;//a表示N个人在圈子内。traitor代表最后剩下的叛徒
  23.    
  24.     //开辟动态链表,将空间首地址赋值给a
  25.     a=(int*)malloc(n*sizeof(int ));
  26.    
  27.     for (i=0; i<n;i++)
  28.     {
  29.         a[i]=i+1;//a[i]保存i个人的编号
  30.     }
  31.     i=0;//从编号为0的人开始报数
  32.    
  33.     while (count>1)//当圈子内剩余人数大于1时执行循环
  34.     {
  35.         flag++;//开始报数
  36.         
  37.         if (flag==m)//报到m得人离开
  38.         {
  39.             //将当前报道m的人删除
  40.             printf("%d号退出圈子\n",a[i]);
  41.             for (j=i; j<count-1; j++)
  42.             {
  43.                 a[j]=a[j+1];//删除报到M的人,表示退出圈子
  44.             }
  45.             count--;//圈子剩余人数-1
  46.             
  47.             flag=0;//报数置位,从新开始计数
  48.             
  49.             i-=1;
  50.             
  51.         }
  52.         i= (i+1)%count;//计算下一个报数人得下标
  53.     }
  54.     traitor = a[0];//最后剩下一个人。把值赋给traitor
  55.    
  56.     return traitor;
  57. }
复制代码

希望对你有帮助,我那会是这么做得。 你可以尝试改下主函数。。多少人  报到多少退出都可以算。这题你把它先看成数学题找找算法。  
回复 使用道具 举报
感谢楼上所有回复。我今晚再照着2楼的思路构思一下,尝试敲一遍。{:3_67:}
不行的话,再研究一下3楼。谢谢。周末愉快。~···
回复 使用道具 举报
典型的约瑟夫环问题,用数组或者链表来实现,踢出去的数据置一个特定的值即可。
回复 使用道具 举报
约瑟夫环
回复 使用道具 举报
istream 发表于 2014-7-27 09:38
典型的约瑟夫环问题,用数组或者链表来实现,踢出去的数据置一个特定的值即可。 ...

{:3_53:}感谢,我百度了解一下看看。
回复 使用道具 举报
楼上几个思路不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马