题目1047:报数问题

有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的变化记录了每一轮报数中出局的人的编号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值