约瑟夫环

来源:互联网 发布:想学软件编程 编辑:程序博客网 时间:2024/06/11 06:13

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

//利用数组int josephu(int n,int m){    int *arr;    arr = new int[n];    memset(arr,1,n);    int i=0,j=0;    for ( i = 0;i < n;i++)    {        int flag = 0;        while(flag<m)        {            if (j == n)            {                j = 0;            }            if (arr[j])            {                flag++;                         }            j++;        }        arr[j-1]=0;        cout<<"第"<<i<<"个:"<<" "<<j<<endl;    }    delete []arr;    return i;}//利用链表typedef struct Node{    int data;    struct Node* next;}Node,*PLink;int josephu_link(int n,int m){    PLink head = NULL;    PLink tail = NULL;    head = new Node;//(PLink)malloc(sizeof(Node));    if(head==NULL)        return -1;    //初始化循环链表    tail = head;        int count = 1;    while(count<=n)    {   tail->data = count;         tail->next = new Node;        tail = tail->next;        count++;    }    tail->data = count;    tail->next = head;    PLink pnode = head;    while(head!=tail)    {        int flag = 1;        while(flag++<m)        {            tail = tail->next;//head            head = head->next;        }        PLink delNode = head;        cout<<delNode->data<<" ";        head = head->next;        tail->next = head;        delete(delNode);        delNode = NULL;         }       return n;}
原创粉丝点击