Linux C写报数游戏


题目:输入两个正整数 n 和 m( (1<m<n<=50)),有 n 个人围成一圈,按顺序从 1 到 n 编号。从第一个人开始报数,报数 m 的人退出圈子,下一个人从 1 开始重新报数,报数 m 的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。

  1. [www.bkjia.com @test baoshu]$ more BaoShu.c   
  2. #include <stdio.h>  
  3. #include <malloc.h>  
  4. /********************************************************************* 
  5. *以循环队列的数据结构实现 
  6. *时间复杂度T(n) 
  7. *采用循环队列数据结构,使得每次对数组的访问次数减少到最少 
  8. **********************************************************************/ 
  9. int main(void
  10.   int i=0,num=1,die=0,front,rear,temp=0; 
  11.   while(num!=0) 
  12.   { 
  13.     printf("\n输入人数,小于零退出:"); 
  14.     scanf("%d",&num); 
  15.     printf("\n输入报到数:"); 
  16.     scanf("%d",&die); 
  17.     int *cycle=(int *)malloc((num+1)*sizeof(int)); 
  18.     for(i=0;i<=num;i++) 
  19.     { 
  20.       cycle[i]=i; 
  21.     } 
  22.     front=1; 
  23.     rear=num; 
  24.     i=1; 
  25.     while(front!=rear) 
  26.     { 
  27.       temp=(rear+1)%(num+1); 
  28.       cycle[temp]=cycle[front]; 
  29.       front=(front+1)%(num+1); 
  30.       if(i==die) 
  31.       { 
  32.         i=1; 
  33.         printf("%d出队\n",cycle[temp]); 
  34.       } 
  35.       else 
  36.       { 
  37.         i++; 
  38.         rear=(rear+1)%(num+1); 
  39.         cycle[rear]=cycle[temp]; 
  40.       } 
  41.     } 
  42.     printf("幸存者是%d\n",cycle[front]); 
  43.     free(cycle); 
  44.     num=0; 
  45.   } 
  46.   return 0; 
  47. }   
  48.  
  49. [www.bkjia.com @test baoshu]$ gcc BaoShu.c -o BaoShu -Wall 
  50. [www.bkjia.com @test baoshu]$ ./BaoShu   
  51.  
  52. 输入人数,小于零退出:9 
  53.  
  54. 输入报到数:5 
  55. 5出队 
  56. 1出队 
  57. 7出队 
  58. 4出队 
  59. 3出队 
  60. 6出队 
  61. 9出队 
  62. 2出队 
  63. 幸存者是8 
  64. [www.bkjia.com @test baoshu]$   

相关内容