zoukankan      html  css  js  c++  java
  • 约瑟夫环问题

    题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
    每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
    当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
    求出在这个圆圈中剩下的最后一个数字。

    这个问题数学上已经得出了递推公式

     递推公式:   f[1]=0;   f[i]=(f[i-1]+m)%i; (i>1)

    当然我们就不推了,这里给出一个中规中矩的用环的方法来解决此问题

     1 Node* Josephus(Node* Head,int m){
     2       Node* p=Head;
     3       while(true){
     4             for(int i=0;i<m-1;i++)//移动m-1次就到了第m个节点
     5                  p=p->next;
     6             if(p->next!=p){//还没到最后一个节点
     7                    Node* temp=p->next;
     8                    int tempdata=p->data;
     9                    p->data=temp->data;
    10                    temp->data=tempdata;
    11                    p->next=temp->next;
    12                    free(temp);
    13             }else//就剩下一个节点了
    14                    break;
    15       }
    16       return p;
    17 }

     给出一个完成的程序

    /*约瑟夫环,输入m,n,输出其序列,例如输入 5,3,输出:3 1 5 2 4*/
    #include <iostream>
    using namespace std;
    typedef struct Node 
    {
        int element;
        Node *pNext;
    }Node,*LinkList;
    void InitList(LinkList& head)
    {
        head=(LinkList)malloc(sizeof(Node));
        head->pNext=NULL;
    }
    int ListLength(LinkList head)
    {
        int length=-1;
        LinkList p=head;
        while (p!=NULL)
        {
            length++;
            p=p->pNext;
        }
        return length;
        
    }
    
    void main()
    {
        cout<<"输入M:"<<endl;
        int M,N;
        cin>>M;
        cout<<"输入N:"<<endl;
        cin>>N;
        LinkList head,rear;
        InitList(head);
        rear=head;
        for (int i=1;i<=M;i++)
        {
            LinkList temp=(LinkList)malloc(sizeof(Node));
            temp->element=i;
            temp->pNext=NULL;
            rear->pNext=temp;
            rear=temp;
        }
        rear->pNext=head->pNext;
        free(head);
        head=rear->pNext;
        i=1;
        while (head->pNext!=head)
        {
            if (i%N!=0)
            {
                rear=head;
                head=head->pNext;
                i++;
            }
            else
            {
                rear->pNext=head->pNext;
                cout<<head->element<<endl;
                free(head);
                head=rear->pNext;
                i++;
            }
        }
        cout<<head->element<<endl;
        free(head);
        head=NULL;
    }
  • 相关阅读:
    Spring实现AOP的4种方式(转)
    【转】一个不错的eclipse反编译插件
    spring配置事务
    使用XFire+Spring构建Web Service(一)——helloWorld篇
    WebService到底是什么?(转)
    ContextLoaderListener作用详解(转)
    SVN检出资源文件
    ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2
    WP8_当滚动到滚动条的70%时,自动加载数据效果实现
    WP8__从windowsphone app store 中根据app id获取应用的相关信息(下载网址及图片id等)
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2518592.html
Copyright © 2011-2022 走看看