Twilight的卡牌游戏
题目
Twilight最近在玩某种无聊的卡牌游戏,游戏的规则是这样的:
初始有n张牌,编号为1-n,依次放在位置1-n上。玩家从第一个回合开始对卡牌进行抽取,
如果当前是奇数回合,抽出所有在2的倍数的位置上的卡牌,剩下的卡牌向小编号方向靠拢;
如果当前是偶数回合,抽出所有在3的倍数的位置上的卡牌,剩下的卡牌向小编号方向靠拢。
当某个回合抽取完毕后剩下的卡牌数不超过三张时,则游戏结束,剩下的卡牌的初始编号之和即为游戏得分。
Twilight有点厌倦了一次一次手动抽取卡牌,他希望你能直接告诉他,对于给定的n,最后剩下的卡牌编号是多少。
输入
输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“[”或者“]”。其中字符“[”表示Home键,“]”表示End键。输入结束标志为文件结束符(EOF)。输入文件不超过5MB。
输出
一共T行,分别对应输入的卡牌数,每行从小到大输出剩下的卡牌的编号,编号之间以一个空格间隔。
输入样例
2
10
40
输出样例
1 7
1 19 37
解题思路
给定个数n,执行一系列操作后,要求剩下最多三个数。可以先计算总共需要执行操作的次数times。然后在times次内,对1~n每个数进行判断是否最后会留下。注意输出格式。
参考代码
#include<stdio.h>
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
int m=n;
int times=0;
while(m>3){
if(times%2==0){
m=m-(m/2);
times++;
}else{
m=m-(m/3);
times++;
}
}
int space=0;
for(int i=1;i<=n;i++){
int cnt=0;
int t=i;
int flag=1;
while(cnt<times){
if(cnt%2==0){
if(t%2==0){
flag=0;
break;
}
t=t-(t/2);
}else{
if(t%3==0){
flag=0;
break;
}
t=t-(t/3);
}
cnt++;
}
if(t!=0 && flag){
if(space!=0)
printf(" ");
printf("%d",i);
space++;
}
}
printf("\n");
}
return 0;
}