1. 程式人生 > >2-3 jmu-報數遊戲 (15 分)

2-3 jmu-報數遊戲 (15 分)

報數遊戲是這樣的:有n個人圍成一圈,按順序從1到n編好號。從第一個人開始報數,報到m(m<n)的人退出圈子;下一個人從1開始報數,報到m的人退出圈子。如此下去,直到留下最後一個人。其中n是初始人數;m是遊戲規定的退出位次(保證為小於n的正整數)。要求用佇列結構完成。輸出數字間以空格分隔,但結尾不能有多餘空格。

輸入樣例:

5 3

輸出樣例:

3 1 5 2 4

輸入樣例:

5 6

輸出樣例:

error!

#include<stdio.h>
#include<stdlib.
h> typedef int ElemeType; typedef struct cod { ElemeType data[100001]; int rare,front; int MaxSize; } CirQueue; CirQueue *InitCQueue() //將佇列置為空 { CirQueue *q=(CirQueue *)malloc(sizeof(struct cod)); q->rare=q->front=0; q->MaxSize=100001; return q; } int EnCqueue(CirQueue *
q,ElemeType x) //入隊 { if(((q->rare)+1)%(q->MaxSize)==q->front)//判斷佇列是否滿了 { printf("The Queue is flow!!!!\n"); return 0; } q->data[q->rare]=x; q->rare=(q->rare+1)%(q->MaxSize);//將對應的下表向後移動 return 1; } int DeCqueue(CirQueue *q,ElemeType *x) //出隊 {
if(q->rare==q->front) //判斷表是否為空 { printf("\nGame over!!!!!!!!\n"); return 0; } *x=q->data[q->front]; q->front=(q->front+1)%(q->MaxSize);//將對應的下表向後移動 return 1; } int test() { CirQueue *q=InitCQueue(); int count; int key; int con; int cache; scanf("%d",&count); scanf("%d",&con); if(con>count){ printf("error!"); return 0; } cache=con; int i=1; while(count--){ EnCqueue(q,i++); } while(q->rare!=q->front) { while(--con){//跳過前面的值 DeCqueue(q,&key);//先取出值 EnCqueue(q,key);//再次存入值 } if(((q->front)+1)%(q->MaxSize)==q->rare)//判斷最後一個不加上空格 { DeCqueue(q,&key);//取除但是不存入 printf("%d",key);//顯示取出的值 break; } if(q->rare!=q->front) { DeCqueue(q,&key);//取除但是不存入 printf("%d ",key);//顯示取出的值 } con=cache;//讓計數器回到原來的值 } } int main() { test(); return 0; }