#include<stdio.h>
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
int n , Throw[52];
while(scanf("%d",&n)&&n!=0){
queue<int>Q;
for(int i = 1 ; i<=n ; i++){
Q.push(i);
}
for(int i = 0 ; Q.size()>1 ; i++){
Throw[i] = Q.front();
Q.pop();
Q.push(Q.front());
Q.pop();
}
if(n!=1) cout<<"Discarded cards: ";
else cout<<"Discarded cards:\n";
for(int i = 0 ; i<n-1 ; i++){
if(i!=n-2) cout<<Throw[i]<<", ";
else cout<<Throw[i]<<"\n";
}
cout<<"Remaining card: "<<Q.front()<<"\n";
}
return 0;
}
思路:
1. int n, int throw[52]; 传入数字n,当数字为0时终止
2. 将1-n的数字压入队列queue<int>Q
3. 模拟操作
for(int i = 0 ; Q.size()>=1 ; i++){
throw[i] = Q.front();
Q.pop();
Q.push(Q.front);
Q.pop();
}
4. 按格式输出
注意!!:当n=1时,直接输出"Discarded cards:\n";要求没有空格。
知识点:
1. 队列的操作:详情请看QueueUVa540;
2. 记住队列是没有clear()操作的。
清空队列的方法:https://www.cnblogs.com/zhonghuasong/p/7524624.html
最高效:
使用swap,这种是最高效的,定义clear,保持STL容器的标准。
void clear(queue<int>& q) {
queue<int> empty;
swap(empty, q);
}