C++:顺序表类实现约瑟夫问题_密码不同

◇◆丶佛笑我妖孽 提交于 2020-03-01 14:47:24
 1 //.h
 2 
 3 #pragma once
 4 #include <iostream>
 5 using namespace std;
 6 #define MAXSIZE 100
 7 
 8 template <class T>
 9 class SeqList
10 {
11   T data[MAXSIZE];
12   int length;
13 public:
14   SeqList();
15   SeqList(T a[],int n);
16   ~SeqList();
17   void Josephus2(int p[], int m0);
18   void PrintList();
19 };
20 
21 
22 template <class T>
23 SeqList<T>::SeqList()
24 {
25   length = 0;
26 }
27 
28 template<class T>
29 SeqList<T>::SeqList(T a[], int n)
30 {
31   length = n;
32   for (int i = 0; i < length; i++)
33     data[i] = a[i];
34 }
35 
36 template <class T>
37 SeqList<T>::~SeqList()
38 {
39 }
40 
41 template<class T>
42 void SeqList<T>::Josephus2(int p[], int m0)
43 {
44   int k = 1;
45   int m = m0;
46   cout << " 出圈顺序为:" << endl;
47   while (length != 0)
48   {
49     k--;
50     int i = (k + m - 1) % length;
51     cout << data[i] << " ";
52     m = p[i];
53     for (int j = i; j < length - 1; j++)
54     {
55       data[j] = data[j + 1];
56       p[j] = p[j + 1];
57     }
58     length--;
59     k = i + 1;
60   }
61   cout << endl;
62 }
63 
64 template<class T>
65 void SeqList<T>::PrintList()
66 {
67   for (int i = 0; i < length; i++)
68   cout << data[i] << " ";
69   cout << endl;
70 }
71 
72  
73 
74 // 约瑟夫问题 密码不同.cpp : 定义控制台应用程序的入口点。
75 //主函数
76 
77 #include "stdafx.h"
78 #include "SeqList.h"
79 #include <iostream>
80 using namespace std;
81 
82 int main()
83 {
84   int a[6] = { 1,2,3,4,5,6 };
85   int b[6] = { 1,2,3,4,5,6 };
86 
87   SeqList<int> s(a,6);
88   s.PrintList();
89   s.Josephus2(b,3);
90 
91   system("PAUSE");
92   return 0;
93 }
94 
95  

题目:约瑟夫环问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人手持一个密码(正整数)。一开始任选一个整数作为报数上限值,从第一人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将它的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去直到所有人全部出列为止。试设计程序实现之。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!