1233: 幸运儿


描述
题目描述:

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

输入:

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

输出:

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

样例输入
12
20
45

样例输出
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
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 3 7 11 15 19 23 27 31 35 39 43 5 13 21 29 37 45 9 25 41 17
1 33

解题思路:
这是有规律的,第1次删人是每隔1个号去掉一个,第二次是每隔3个号去掉一个,第3次是每隔7个号去掉一个,第i次是每隔2的i次方-1,。如果只删一次人,那么剩下的必为1、3,删两次的话剩下的必为1、5

#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,a[53],count=0;
for(i=2;i<=n;i=i+2)
{
count++;
printf("%d ",i);
}
if(count==n-2)
{
printf("\n1 3\n");
continue;
}
for(i=3;i<=n;i=i+4)
{
count++;
printf("%d ",i);
}
if(count==n-2)
{
printf("\n1 5\n");
continue;
}
for(i=5;i<=n;i=i+8)
{
count++;
printf("%d ",i);
}
if(count==n-2)
{
printf("\n1 9\n");
continue;
}
for(i=9;i<=n;i=i+16)
{
count++;
printf("%d ",i);
}
if(count==n-2)
{
printf("\n1 17\n");
continue;
}
for(i=17;i<=n;i=i+32)
{count++;
printf("%d ",i);
}
if(count==n-2)
{

printf("\n1 33\n");
continue;
}
}
return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值