谁是赌神
Time Limit: 1 s | Memory Limit: 64 MB
Difficulty: 1
Description
ACM队四位大神坐在一起玩纸牌,要决出谁才是真正的赌神之名,他们玩得游戏规则呢
很简单,就是有n张纸牌从上到下按顺序依次是1,2,3,4,5...n,每次操作呢就是把最上面的一张牌
扔掉然后再把现在在最上面的那一张拿走放在最下面。比如原始序列是1,2,3,4,5...n一次操作后
就变成了3,4,...n,2,他们的规则是随便给出一个数n,谁能快速答出这n张牌反复经过上述操作后
最后剩下的纸牌的编号是多少就算谁赢。各大神们都是不愿轻易服输之辈,他们冥思苦想,最后
终于lt大神和ctx大神在最短的时间内解决了这个问题,但是呢,赌神只有一个,这怎么办呢,没办
法,经过协商,lt大神获得赌圣之名,ctx大神获得赌仙之名,当然这是后话。现在的问题是,如果
你也参加了赌神争夺战,你能不能也夺得赌神之名呢?看你的了!
Acm队的大神说过,AC就像爱情,来的那么突然,让你惊讶,并且欣喜若狂。
尽情的来吧~~~~!!!
Input
每一行输入一个整数,代表纸牌的数量n(1<=n<=500000),输入整数0代表输入结束 数据保证数据的组数不会超过500000组
Output
输出: 每组输入数据的输出占一行,输出只有一个数字,代表最后剩下的牌的编号
Sample Input
1
Sample Output
1
Source
1
Hint
测试数据好坑
测试数据真的好坑
这一题是一个规律题,开始用数组模拟做的,果断超时,之后多写了几组,发现了规律,接下来是规律,1-1,2-2,3-2,4-4,5-2,6-4,7-6,8-8...16-16..32-32懂了吧,,,,循环的...
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, result;
scanf("%d", &n);
while(n != 0)
{
if(n == 1)
{
printf("1\n");
}
else if(n == 2)
{
printf("2\n");
}
else if(n == 3)
{
printf("2\n");
}
else if(n == 4)
{
printf("4\n");
}
else
{
for(i = 1; ; i++)
{
result = (int)pow(2, i);//printf("%d", result);
if(result >= n)
{
break ;
}
}
int sum = result ;
// for(i = sum; i > n; i--)
//{
sum = sum - 2 * (sum - n);//竟然改成这样直接计算就不超时了,我简直是醉了
//}
printf("%d\n", sum);
}
scanf("%d", &n);
}
return 0;
}