问题 1213: 幸运儿【神题意】

该博客讨论了一个数学问题,参与者围成圈,按顺时针每隔一人淘汰,直至剩下两人。问题探讨了如何确定开始位置以成为最后的幸运儿,并提供了两种不同的理解方式,对应两种代码实现。第一种代码可能不产生预期结果,而第二种代码确保1号始终在最后两人之中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间限制: 1Sec 内存限制: 128MB

题目描述

n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)

输入
有多个测试序列。每行是开始时的人数n

输出
第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之间用一个空格分开。

样例输入
12
20
样例输出
2 4 6 8 10 12 3 7 11 5
1 9
2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9
1 17

Code

读题
题目中心句:从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环。
断句1:从编号为1 的人开始 // 按顺时针方向每隔一人选出一个,剩下的人重新围成一圈 // 如此循环。
循环这句话:按顺时针方向每隔一人选出一个,剩下的人重新围成一圈
短句2:从编号为1 的人开始 ,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈 // 如此循环。
循环这句话:从编号为1 的人开始 ,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈
两种断句方式对应两种代码

Code 1 不符合样例,对应断句1

即每跳出一人,剩下的人立即重新围成一圈,从下一个人开始继续数数
也就是说1号可能会不在最后的两个人中

#include<stdio.h>
int main()
{
   
   
	int vi[51]={
   
   0},i,n,rm;
	while(scanf("%d", &n)+1){
   
   
		for(i=1,rm=n;i<=n;i
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值