close
Content

給你一副照順序放好的紙牌,其中卡片的編號從1~n,且1號排在最上面,n號牌在最底下。
只要這副牌還有兩張以上,你就必須照以下的規則操作:

丟掉最上面的那張牌,然後把目前最上面的那張牌放到牌堆的最下面。
 
你的工作是找出每張牌被丟掉的順序,以及最後剩下的那張牌。
Input

輸入的每一列包含一個整數 n≤50,當輸入為0時代表輸入結束,你不應該處理這個輸入。

Output

對每個輸入的數字產生兩列輸出,第一列是每張牌被丟掉的順序,第二列則是剩下的那張牌。
任何一列都不應該有任何前置或尾隨的多餘空白,輸出細節請參考sample output。

Sample Input #1
7
19
10
6
0
Sample Output #1
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

python

#Discarded cards: 1, 3, 5, 7, 4, 2
#Remaining card: 6
from collections import deque
while True:
    try:
        t=int(input())
        if t==0:break
        que=deque([x for x in range(1,t+1)])
        que.reverse()
        #print(que)
        ans=[]
        while len(que)>1:
            w=que.pop()
            ans.append(w)
            que.rotate(1)
        print("Discarded cards:",end=' ')
        print(*ans,sep=', ')
        print(f'Remaining card: {que.pop()}')

    except:break

C++:

#include <iostream>
#include <queue>
using namespace std;
int main()
{
	int n;
	while(cin>>n){
		if(n==0)break;
		queue<int> que;
		for(int i=0;i<n;i++){
			que.push(i+1);
		}
		/*-------------*/
		cout<< "Discarded cards:";
		for(int i=0;i<n-1;i++){
			if(i!=0){cout<<",";}
			cout<<" "<<que.front();
			que.pop();//丟棄上面那一張
			que.push(que.front()) ;
			que.pop();
		}
		/*-------------*/
		cout<<"\n";
		cout<< "Remaining card: " << que.front() <<"\n";
	}
    return 0;
}
arrow
arrow
    創作者介紹
    創作者 趴趴熊日常 的頭像
    趴趴熊日常

    資工趴趴熊的小天地

    趴趴熊日常 發表在 痞客邦 留言(0) 人氣()