约瑟夫圆环的三种解决方案
来源:互联网 发布:压缩感知重构算法最新 编辑:程序博客网 时间:2024/06/05 10:24
介绍
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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 3p->data = 3p->data = 6p->data = 9p->data = 2p->data = 7p->data = 1p->data = 8p->data = 5over--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;}
0 0
- 约瑟夫圆环的三种解决方案
- 【android】绘制圆环的三种方式
- 【android】绘制圆环的三种方式
- 【android】绘制圆环的三种方式
- 约瑟夫圆环的两种实现,数组模拟和链表模拟
- 约瑟夫环的三种解法
- 约瑟夫环的三种实现方式
- 约瑟夫环的三种实现
- Uva133 约瑟夫圆环新解
- 约瑟夫问题 之Java两种解决方案
- Android自定义view三圆环
- 约瑟夫问题三种求解方法
- 三种方法求解约瑟夫环问题
- 约瑟夫问题 三种实现方法
- 约瑟夫环数组解决方案
- opengl圆环的绘制
- 自动旋转的圆环
- 三种Http Session解决方案的优缺点
- wpa_supplicant与wpa_cli之间通信过程
- 【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
- android.os.Process.killProcess(android.os.Process.myPid());重启应用的原理
- PHP魔术方法和魔术常量介绍及使用
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
- 约瑟夫圆环的三种解决方案
- linux下Shell命令别名设置
- 【SSH网上商城项目实战30】项目总结(附源码下载地址)
- Android学习资源和工具
- 浅谈~区块链的现状与未来!
- Vi编辑器命令
- PHP ceho用法
- ${pageContext.request.contextPath}的作用
- python filter/map/reduce的用法