有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
初始人数n
最后一人的初始编号
输入
3
输出
2
注意n既是初始人数,在代码里的for循环里也是轮数,表示last从1开始每一轮所淘汰的编号。
如果n=4:第一轮last=(1+3)%1为0,第二轮last=(0+3)%2为1,第三轮last=(1+3)%3为1,第四轮last=(1+3)%4=0。既然返回last+1,最后返回的是1
没搞懂
#include<iostream>
using namespace std;
int findLastPerson(int n){
int last=1; // 初始化最后剩下的人的编号为1
for(int i=1;i<=n;i++){ // 循环报数轮数
last=(last+3)%i; // 计算出局人的编号
}
return last+1; // 返回最后剩下的人的编号
}
int main(){
int n=1;
cin>>n; // 输入报数总人数
cout<<findLastPerson(n)<<endl; // 输出最后剩下的人的编号
return 0;
}
last的值在每一轮报数中会根据
公式(last+3)%i变化,作用是记录每一轮报数中出局的人的编号。
具体来说,last的初始值为1,表示第一轮开始时从第一个人开始报数。在每一轮报数中,当报到3的时候,last的值会更新为出局的人的编号。
通过计算(last+3)%i,可以保证last的值始终在每一轮报数中循环变化,且范围为0到i-1。这样,在每一轮报数中,last的值就能正确地记录下一个出局的人的编号。
最后,求得最后剩下的人的编号,可以通过返回last+1来实现。
简而言之,last的变化记录了每一轮报数中出局的人的编号。