题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。

输入
输入两个整数n和m,1<=m<=n<=100。

输出
输出猴王的编号 

样例输入
复制
8 3
样例输出
复制
7

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 200
 7 struct monkey{
 8     int xu;//猴子的序号 
 9     int biao;//标记猴子是否出局
10 }monk[N];
11 int main()
12 {
13     int n,m,i,j,k,flag,t,sum;
14     while(scanf("%d %d",&n,&m)!=EOF)
15     {
16         for(i=1;i<=n;i++)
17         {
18             monk[i].xu=i;
19             monk[i].biao=0;
20         }//初始化 
21         flag=0;
22         k=0;
23         while(flag!=1)//当只剩下一只猴子没有出局时跳出 
24         {
25             for(i=1;i<=n;i++)
26             {
27                 /*sum=0; 
28                  for(j=1;j<=n;j++)
29                 {
30                     if(!monk[j].biao)
31                     {
32                         sum++;
33                         t=j;
34                     }    
35                 }
36                 if(sum==1)
37                 break;*/   //把这部分删掉的话 当m=1时,没有结果,但可以提交正确(后台数据--2333) 
38                 //审题需要考虑特殊情况,最好加上 
39                 if(!monk[i].biao)//如果该猴子没有出局
40                 {
41                     k++;
42                        if(k==m)
43                      {
44                          monk[i].biao=1;
45                         k=0;//重新开始报数    
46                     }
47                 } 
48             }
49             sum=0;// 统计还有几只猴子没有出局 
50             for(i=1;i<=n;i++)
51             {
52                 if(!monk[i].biao)
53                 {
54                     sum++;
55                     t=i;// 最后更新为最后一只没有出局的猴子 
56                 }    
57             }
58             if(sum==1)
59             flag=1;//跳出循环 
60         }
61         printf("%d\n",t);
62     }
63     return 0;
64 }