約瑟夫問題
約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最后 結果+1即為原問題的解。
循環隊列求解(鏈式)
#include<stdio.h> #include<stdlib.h> //循環隊列 //typedef int ElemType; typedef struct QueueNode { int data; struct QueueNode *next; }QueueNode; typedef struct Queue { QueueNode *front; QueueNode *rear; }Queue; void InitQueue(Queue *q) { q->front=q->rear=NULL; } void EnQueue(Queue *q , int value) { QueueNode *temp=(QueueNode*)malloc(sizeof(QueueNode)); temp->data=value; if(q->rear==NULL) { temp->next=temp; q->rear=q->front=temp; } else { temp->next=q->rear->next; q->rear->next=temp; q->rear=temp; } }//enter a element from the tail void DeQueue(Queue *q, int *value) { QueueNode *temp=(QueueNode*)malloc(sizeof(QueueNode)); if(q->rear==NULL) { return; }// It's null else if(q->rear->next==q->rear) { *value=q->front->data; free(q->rear); q->rear=q->front=NULL; }//It just has one node else { *value=q->front->data; temp=q->front; q->front=temp->next; q->rear->next=q->front; }//more one node free(temp); }//delete a element from the head int main() { Queue *q=(Queue*)malloc(sizeof(Queue)); int i,m,n,count,temp; printf("請輸入人數n和循環要報的數m(兩數之間留個空格)\n"); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) EnQueue(q,i); printf("出圈序列:\n"); while(q->front) { count=1; while(count<m) { q->front=q->front->next; q->rear=q->rear->next; count++; } count=1; DeQueue(q,&temp); printf("%d ",temp); } putchar('\n'); }
簡單解法
#include <stdio.h> int josephus(int n, int m) { if(n == 1) { return 0; } else { return (josephus(n-1, m) + m) % n; } } int main() { int n, m; while (scanf("%d", &n) == 1) { if (!n) { break; } scanf("%d", &m); int result = josephus(n, m); printf("%d\n", result+1); } return 0; }