约瑟夫Josephus解法

来源:互联网 发布:婚礼网络直播 编辑:程序博客网 时间:2024/06/05 23:52

1、链表方式:

         #include <stdio.h>
         #include <malloc.h>

         struct node_t
        {
            int value;
            struct node_t *next;
         };

         int main()
         {
              struct node_t *pe;
              struct node_t *first;
              int n, i;

              printf("please input in n ");
              scanf("%d", &n);

              pe = (struct node_t *) malloc(sizeof(struct node_t) * n);

              for (i=0;i<n - 1;i++)    /*初始化循环链表*/
              {
                 (pe + i)->value = i+1;
                 (pe + i)->next = pe + i + 1;
              }
              (pe + i)->value = i + 1;
              (pe + i)->next = pe;
              first = pe;

              while(1)
              {
                  first = first->next;   /*指向报数的二号*/
                  first->next = first->next->next;  /*将3号从链表中去掉*/
                  if(first->next == first)  /*判断链表是否只剩最后一个元素*/
                  break;
                  first = first->next;   /*指针指向后续报数元素*/
              }
              printf("the last one is %d ", first->value);
              free(pe);
        }

 

 

1/////////////////////////////////////////////////////////////////////////////
 2///          算法与数据结构 Josephus 问题解决方案          ///
 3///               用方法一非递归进行出列运算源程序             ///
 4/////////////////////////////////////////////////////////////////////////////

 5
 6
 7#include <iostream>
 8using namespace std;
 9
10int n,s,m;//设置全局变量
11int *seat;//数组指针,指向各座位,注意这里以系统内部index base 0为准。
12int main()
13{
14    //参数输入
15    cout<<"please input n:";
16    cin>>n;
17    cout<<"please input s:";
18    cin>>s;
19    cout<<"plesae input m:";
20    cin>>m;
21    //分配座位表空间
22    seat=new int[n];    
23    //对各座位上people的编号
24    for(int i(0);i<n;i++)
25    {
26        seat[i]=i+1;
27    }

28
29    
30    //将变量转化为系统内部index base 0;
31    s--;
32    
33    //方便需要
34    m--;
35
36    int temp;
37
38    for(int i=0;i<n;i++)
39    {
40        s=(s+m)%(n-i);//第S位被OUT,s base 0;
41        if(s!=n-i-1)//当s=n-i-1时并不需要进行移位
42        {
43            temp=seat[n-i-1];
44            seat[n-i-1]=seat[s];
45            for(int j=s;j<n-i-2;j++)
46                seat[j]=seat[j+1];
47            seat[n-i-2]=temp;
48        }

49        
50    }

51    
52    //输出出列顺序表
53    cout<<"the out people list is:";
54    for(int i=n-1;i>=0;i--)
55        cout<<"P"<<seat[i]<<" ";
56    
57    //释放座位数组空间
58    delete []seat;
59
60    return 0;
61}

原创粉丝点击