介绍
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解。
第一种
# include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
class CircleCount {
public:
CircleCount(){}
CircleCount(int n, int m) ;
StartGame();
private:
Node* first;
int m;
};
CircleCount::CircleCount(int n, int _m) {
m = _m;
Node* pre ,*p;
first = new Node;
first->data = 1;
pre = first;
for (int i = 2;i <= n; i++) {
p = new Node;
p->data = i;
pre->next = p;
pre = p;
}
pre->next = first;
}
CircleCount::StartGame() {
Node *pre, *p, *s;
pre = first;
p = pre->next;
int count = 2;
while (pre != p->next) {
if (count == m) {
cout<<"p->data = "<<p->data<<endl;
pre->next = p->next;
delete p;
//pre = pre->next;
p = pre->next;
count = 1;
}
count++;
pre = p;
p = p->next;
}
cout<<"over--p->data = "<<p->data<<endl;
delete p;
}
int main() {
cout<<"input the n(number) and the m(password):";
int n,m;
cin>>n>>m;
CircleCount c(n, m);
c.StartGame();
return 0;
}
/*
input the n(number) and the m(password):10 3
p->data = 3
p->data = 6
p->data = 9
p->data = 2
p->data = 7
p->data = 1
p->data = 8
p->data = 5
over--p->data = 4
请按任意键继续. . .
*/
第二种
# include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
class CircleCount {
public:
CircleCount(){}
CircleCount(int n, int m) ;
StartGame();
private:
Node* first;
int m;
Node* rear;
};
CircleCount::CircleCount(int n, int _m) {
m = _m;
Node* pre ,*p;
first = new Node;
first->data = 1;
pre = first;
for (int i = 2;i <= n; i++) {
p = new Node;
p->data = i;
pre->next = p;
pre = p;
}
rear = pre;
pre->next = first;
}
CircleCount::StartGame() {
Node *pre, *p, *s;
pre = rear;
p = pre->next;
int count = 1;
while (pre != p->next) {
if (count == m) {
cout<<"p->data = "<<p->data<<endl;
pre->next = p->next;
delete p;
//pre = pre->next;
p = pre->next;
count = 1;
}
count++;
pre = p;
p = pre->next;
}
cout<<"over--p->data = "<<p->data<<endl;
delete p;
}
int main() {
cout<<"input the n(number) and the m(password):";
int n,m;
cin>>n>>m;
CircleCount c(n, m);
c.StartGame();
return 0;
}
第三种
# include <iostream>
# include <ctime>
# include <cstdlib>
using namespace std;
struct Node
{
int data;
Node *next;
};
class CircleCount {
public:
CircleCount(){}
CircleCount(int n, int m) ;
StartGame();
private:
Node* first;
int m;
Node* rear;
};
CircleCount::CircleCount(int n, int _m) {
m = _m;
Node* pre ,*p;
first = new Node;
srand(time(NULL));
first->data = rand()%n;;
pre = first;
for (int i = 2;i <= n; i++) {
p = new Node;
p->data = rand()%n;// 随机数
pre->next = p;
pre = p;
}
rear = pre;
pre->next = first;
}
CircleCount::StartGame() {
Node *pre, *p, *s;
pre = rear;
p = pre->next;
int count = 1;
while (pre != p->next) {
if (count == p->data) {
cout<<"p->data = "<<p->data<<endl;
pre->next = p->next;
delete p;
//pre = pre->next;
p = pre->next;
count = 1;
}
count++;
pre = p;
p = pre->next;
}
cout<<"over--p->data = "<<p->data<<endl;
delete p;
}
int main() {
cout<<"input the n(number) and the m(password):";
int n,m;
cin>>n>>m;
CircleCount c(n, m);
c.StartGame();
return 0;
}