1. 程式人生 > >約瑟夫環加強版--For初學者

約瑟夫環加強版--For初學者

經典的約瑟夫問題,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;
}

我把每個人手裡的數字用隨機數生成。 執行結果如下: 在這裡插入圖片描述