报数

报数

题目描述ios

有n个小朋友作游戏,他们的编号分别是1,2,3...n。他们按照编号从小到大依次围成一个圆圈,从第一个小朋友开始从1报数,依次按照顺时针方向报数(加一),报m的人会离开队伍,而后下一个小朋友会继续从1开始报数,直到只剩一个小朋友为止。spa

输入格式code

第一行输入两个整数,n,m。(1≤n,m≤1000)blog

输出格式队列

输出最后一个小朋友的编号,占一行。游戏


 样例输入ci

10 5

样例输出io

3 

解法class

  一道较为经典的队列题。stream

  首先要明白这题为何能够用队列来作,“围成一个圆圈”其实就能够想象成一个相似的队列。须要一个while循环,每次循环先把队首小朋友报的数字保存下来,再把队首的小朋友踢出去,而后检查小朋友报的数字和m是否相同。若是相同,那么就把小朋友再请回来;反之,踢出去就踢出去好了。那为何要先踢出去呢?由于小朋友们围成的是一个圆圈,而队列只是一个受限制的线性结构。从队首踢出,再回到队尾,就模拟了一个圆圈。

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int main ()
 5 {
 6     queue<int> q;
 7     int n,m;
 8     cin>>n>>m;
 9     for(int i=1;i<=n;i++)
10     {
11         q.push(i);
12     }
13     int t=1;
14     while(q.size()>1)
15     {
16         int now=q.front();
17         q.pop();
18         if(t!=m)
19         {
20             q.push(now);
21         }
22         else
23         {
24             t=0;
25         }
26         t++;
27     }
28     cout<<q.front()<<endl;
29     return 0;
30 }

  第13行的t是用来存储小朋友要报的数字,并且每当有小朋友报数=m时,t就要从1从新开始。那你可能会发现,第24行给t赋的值是0,这是由于在这个if判断以后,26行有一个t++的操做~

  第16行的now是用来存储队首小朋友报的数字的,由于若是把队首小朋友踢出去了,再想获取他报的数字就很困难,因此咱们就先用变量now将报的数字保存下来。

相关文章
相关标签/搜索