一。问题详解:
鲁智深有一天来到匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头。智清长老不想给他吃,又不愿得罪鲁智深,便把它安排在特定位置,之后对所有人说:从我开始报数(围成一圈),第5个人可以吃到馒头(并退下),按此方法,所有和尚都迟到了馒头,唯独鲁智深没有吃上,请问长老把他安排在了那个位置?
二。思路:
我用的队列的思路,queue,首先我们依次排列,如果数到了第5个数,则这个人出队,否则出队后继续入队排到后面。当队列中只剩下了最后一个人时。则这个人就是鲁智深的位置。
三。代码详解:
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
queue<int> q;
for(int i = 1; i <= n; i++) {
q.push(i);
}
int cur = 1; //计数变量
while(q.size() > 1) {
int x = q.front();
q.pop();
if(cur == m) {
cur = 1;
} else {
q.push(x);
cur++;
}
}
cout << q.front() << endl;
return 0;
}
答案为第47个位置。
四。相似题目:有1,2,3,4,5,6,7一共7个小朋友,从前往后数,每第5个人可以拿到一个糖吃,然后退出从下一个人开始数,一直到最后一个人。请问哪一个小朋友没有糖吃。
答:根据上面的程序,输入: 7 5 (7个人,每5个人拿一次)。