約瑟夫環加強版--For初學者
阿新 • • 發佈:2018-12-13
經典的約瑟夫問題,click here,本文是加強版的,問題是這樣的,n個人圍成一圈,每一個人手裡拿著一個紙條,每一個紙條上面寫著一個數字(我們假設在1~100之間),首先,給出一個數,從第k個人開始報數,淘汰一個人,淘汰的人開啟手裡的紙條,從他下一個開始報數,直到報數到紙條上的數,依次進行直到剩餘一人。
本文的程式碼註釋不多,如果有看不太懂的讀者,那麼點選這裡。
本人能力有限,難免有bug,編譯環境為Code::Blocks,如有疑問,請留言。
程式碼如下:
#include<stdio.h> #include<string.h> #include <stdlib.h> #include <time.h> typedef int ElemType; typedef struct node { ElemType data; ElemType nextdata;//記錄淘汰人手裡的號碼 struct node *next; }LNode; void Josephus(ElemType n,ElemType m,ElemType k) { srand(time( NULL )); LNode *q,*p; ElemType i,elem; p=(LNode *)malloc(sizeof(LNode)); q=p; for(i=1;i<n;i++) { q->data=k; q->nextdata=1 + (rand()%100);//隨機生成1~100的數字 printf("第%d個人,手裡的號碼:",k); printf("%d\n",q->nextdata); k=k%n+1; q->next=(LNode *)malloc(sizeof(LNode)); q=q->next; } q->data=k; q->nextdata=1 + (rand()%100); printf("第%d個人,手裡的號碼:",k); printf("%d\n",q->nextdata); q->next=p; printf("依次淘汰的人\n"); elem=m;//最開始淘汰的人是給定的數 while(p->next!=p) { for(i=1;i<elem;i++) { q=p; p=p->next; } q->next=p->next; printf("%4d",p->data); elem=p->nextdata;//淘汰一個人,把他手裡的號碼記錄下來 free(p); p=q->next; } printf("\n剩的最後一人\n"); printf("%4d",p->data); } ElemType main() { ElemType n,k,m; printf("輸入人數n,開始的報數m,開始的人k\n"); scanf("%d%d%d",&n,&m,&k); Josephus(n,m,k); return 0; }
我把每個人手裡的數字用隨機數生成。 執行結果如下: