头歌 排号报数

通过C++代码模拟,解决N人圆圈报数问题,每报到3人淘汰,找出最后存活者的原始编号。
摘要由CSDN通过智能技术生成
题目描述

有 N 个人绕成圆圈,按照顺序排号 (1-N) ,第一个人从 1 开始依次报数,报到 3 的人淘汰,接下来的人又从 1 开始依次报数,报到 3 的人淘汰;再报数,直到只剩下一个人,问最后留下的是原来第几号的那个人。

输入格式

一个 ≥1 的整数,代表总共有多少人。

输出格式

一个整数,代表最后剩下的人是几号。

输入输出样例

输入格式 10

输出格式 4

说明/提示

排号从 1 开始。

#include <bits/stdc++.h>
using namespace std;
struct man{
	int flag;
	int drop;
};
man m[10086];
int main()
{	
	int n;
	cin>>n;
	if(n==1) cout<<"1";//特殊情况 
	else{
		for(int i=1;i<=n;i++){
			m[i].flag=i;//记录原始编号 
			m[i].drop=0;//.drop==0表示没被淘汰 
		}
		int cntdrop=0;//计算有几个淘汰的 
		int k=1;//标记游戏是否该结束--控制while循环 
		int cnt=0;//计数器--报数 
		while(k){
			for(int i=1;i<=n;i++){
				if(m[i].drop==0){
					cnt++;
					if(cnt==3){
						m[i].drop=1;//标记淘汰 
						cntdrop++;
						if(cntdrop==n-1) k=0;//淘汰到只剩一个 结束游戏 
						cnt=0;//重新报数 
						}	
					}
				}
			}
		for(int i=1;i<=n;i++){
			if(m[i].drop==0)cout<<m[i].flag;
		}
	}
}

做好记录 按要求模拟即可 没有难点

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值