經典的約瑟夫問題,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;
}
我把每個人手裏的數字用隨機數生成。
運行結果如下: