p.s.自用
题目描述
魔法师在玩一种扑克牌游戏,n张扑克分别记上1,2,……,n他打开第一张是1,把它放在一边。然后把最上面的两张一张一张地依次移到最后,打开上面一张刚好是2,再放在一边;然后把上面的3张一张一张移到最后,打开上面一张刚好是3,再放到一边;……如此重复下去,直到打开最后一张是n,放在一边;这时他发现,放在一边的扑克刚好是1,2,……,n这样排列的。请编程输出这些扑克原来是怎么排列的。
输入
一行一个正整数n
输出
一行n个正整数,表示这些扑克牌原来的排列顺序,每两个数之间有一个空格。
样例输入 Copy
【输入样例1】 5 【输入样例2】 9
样例输出 Copy
【输出样例1】 1 4 5 2 3 【输出样例2】 1 8 6 2 9 4 5 3 7
提示
数据范围:
70%的数据:n<=100;
30%的数据:n<=10000
答案
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct queue {
int* data;
int front;
int rear;
int maxsize;
}arrQ;
arrQ init(int n)//初始化
{
arrQ q;
q.data = (int*)malloc(n * sizeof(int));
q.front = q.rear = 0;
q.maxsize = n;
return q;
}
void enQueue(arrQ* q, int k)//入队
{
if ((q->rear + 1) % q->maxsize == q->rear)//判满
return;
q->data[q->rear] = k;
q->rear = (q->rear + 1) % q->maxsize;
}
int deQueue(arrQ* q)//出队
{
if (q->rear != q->front)//判空
{
int k = q->data[q->front];
q->front = (q->front + 1) % q->maxsize;
return k;
}
}
int main()
{
int n;
scanf("%d", &n);
arrQ q = init(n);
for (int i = n; i > 0; i--)
{
enQueue(&q, i);
if (i == 1)
break;
for (int j = 0; j < i; j++)
{
int k = deQueue(&q);
enQueue(&q, k);
}
}
for (int i = n - 1; i >= 0; i--)
printf("%d ", q.data[(i + q.front) % q.maxsize]);
}