作业记录:
Description
桌子上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n。当至少剩下两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后。输入n,输出每次扔掉的牌,以及最后剩下的牌。
Input
第一行为一个整数t(0<t<20),表示测试用例个数。以下t行每行包含一个整数n(0<n<40),为一个测试用例的牌数。 如: 1 7
Output
为每个测试用例单独输出一行,该行中依次输出每次掷出的牌的编号以及最后剩下牌的编号,每个牌编号后跟着一个空格。 如: 1 3 5 7 4 2 6(空格)
#include<stdio.h>
void card(int n){
int cards[n];
//学校编译器不支持直接全部赋值所以走个循环给卡牌赋值
for(int i=0;i<n;i++){
cards[i]=i+1;
} //题目说将牌放在底下,不过我是置顶了
int i=-2;
for(int t=0;t<n;t++){
i+=2;
printf("%d ",cards[i]);
//扔完一张,下一张直接置顶
//如果扔完一轮了,这里要分奇偶两种情况调整
if(i+2>n)i=-1;
if(i+2<=n)cards[t]=cards[i+1];
if(i+2==n)i=-2;
}//这里搞个图解可能更清晰
}//但是这里不方便画图
//可以按奇偶两种情况自己举个例子试试
int main(){
int t;
scanf("%d",&t);
int n[t];
for(int i=0;i<t;i++){
scanf("%d",&n[i]);
card(n[i]);
printf("\n");
}
return 0;
}
如果有可以改进的欢迎评论指出,谢谢!