约瑟夫环
来源:互联网 发布:淘宝食品店铺名字大全 编辑:程序博客网 时间:2024/05/17 05:28
编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序输出出列顺序。
本人菜鸟,请高手不吝赐教。
#include<iostream>
using namespace std;
class joseph
{
public:
int data;//每个人的座位号
int code;//每个人的密码
struct joseph *next;//保存下一个结点的地址
}list;
void build(joseph *list,int n)
{
int i;
joseph *p,*q;
list->data=1;
cout<<"请输入"<<n<<"个人的密码"<<endl;
cin>>list->code;
q=list;//q代表尾结点
for(i=2;i<=n;i++)
{
p=new joseph;
p->data=i;
cin>>p->code;
q->next=p;
q=p;
}
p->next=list;
}
void operate(joseph *list,int n,int m)
{
joseph *p,*q,*r;
int x=n;//x表示当前环内的人数
p=list;
while(p->next!=list)
{
p=p->next;//找到尾结点
}
while(p->next!=p)
{
q=p;
m%=x;
if(m==0)
{
m=x;
}
while(--m)
{
q=q->next;//找到将要被删除的结点的上一个结点
}
r=q->next;//找到将被删除的结点
q->next=r->next;
cout<<r->data<<' ';
m=r->code;
--x;
delete[]r;
p=q;
}
cout<<p->data<<endl;
delete[]p;
}
int main()
{
joseph *list=new joseph;
int n,m;
cout<<"请输入总人数"<<endl;
cin>>n;
build(list,n);
cout<<"请输入初始密码值"<<endl;
cin>>m;
cout<<"出列顺序为"<<endl;
operate(list,n,m);
return 0;
}
- 约瑟夫问题、约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 约瑟夫环
- 2010.04.19
- 没有买房和买车的朋友瞧瞧(香港著名经济学家——郎咸平)
- javascript俄罗斯方块【附带源码】
- 学习笔记: CIC filter及其matlab实现
- 解决删除文件时出现“无法读取源文件或磁盘”的办法
- 约瑟夫环
- IE8打印设置边距转换出现错误
- 后台取 gradpanel 行(选择,未选择,已选择)
- 为什么把LoadRunner删除了TestDirector就不能正常运行了
- 如果能回到过去
- zk中布局的改变方法。
- OC门
- 新的开始
- eclipse快捷键大全 (有重复,自己整理下)