10935 Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n at the bottom. The following operation is performed as long as there are at least two cards in the deck:
Throw away the top card and move the card that is now on the top of the deck to the bottom of the deck.
Your task is to find the sequence of discarded cards and the last, remaining card.
Input
Each line of input (except the last) contains a number n ≤ 50. The last line contains ‘0’ and this line should not be processed.
Output
For each number from the input produce two lines of output. The first line presents the sequence of discarded cards, the second line reports the last remaining card. No line will have leading or trailing spaces. See the sample for the expected format.
Sample Input
7
19
10
6
0
Sample Output
Discarded cards: 1, 3, 5, 7, 4, 2
Remaining card: 6
Discarded cards: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14
Remaining card: 6
Discarded cards: 1, 3, 5, 7, 9, 2, 6, 10, 8
Remaining card: 4
Discarded cards: 1, 3, 5, 2, 6
Remaining card: 4
解题思路:首先这个循环是以0的输入为结束标志,所以在判断输入时要先看看它是不是为0.这个解题要用到队列,队列的特点是先进先出,利用front()进行数据的读取,pop()进行出队,push()进行入队,基本上就可以写出一个轮廓。注意一点的是,这个步骤要在这个队列不为空的情况下进行。还要注意题目要求的输出格式,输出第一行的最后一个数字后面没有逗号隔开,所以在每一次读取与出队之后要判断这个队列是否为空,然后再进行下一步操作。
程序代码:
#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
int x;
queue<int>s;
for(int i=1;i<=n;i++)
s.push(i);
int flag=0;
printf("Discarded cards:");
while(!s.empty())
{
x=s.front ();
s.pop ();
if(s.empty()) break;
if(!flag)cout<<" "<<x;
else
cout<<", "<<x;
flag=1;
x=s.front();
s.pop();
s.push(x);
}
cout<<endl;
printf("Remaining card:");
printf(" %d
",x);
}
return 0;
}