约瑟夫环

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值