出圈子问题

题目描述:
有n个人围成一圈,按顺序排号 从第一个人开始报数(从1到3报数) 所有报到3的人退出圈子 问最后留下来的是第几个人
我们可以将这个题目看成以一类题目:
n个人围成一圈 从第一个人开始数 数到N的人被淘汰 问最后剩哪个人(n和N由键盘输入)

/**
 * 设没有被淘汰的人的状态为 0  淘汰了的人的状态为 1 
 */

#include <iostream>
#include <cstdio>
using namespace std;


int main() {
    int n, N;
    cin >> n >> N;
    int sum = 0, num = 0, h[n] = {0};//对数组赋初值为0


    for ( int i = 0; sum != n - 1; i++ ){//一直循环直到只剩一个人在圈子里面 
        if ( !h[i % n] ) { //如果h[i%n]为0则继续数 (注意对人数取余  防止越界)
            num++;
            if ( !(num % N) ) { //数到数字N的时候令其等于1(出圈子) 
                h[i % n] = 1;
                sum++;
            }
        }
    }

    for ( int i = 0; i < n; i++ ) {
        if ( h[i] == 0 ) {
            printf("%d\n", i  + 1);//输出最后剩下的一个在圈子里面的下标加一(因为是第几个人  从1开始)
        }
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值