您的位置:首页 > 编程语言 > C语言/C++

约瑟夫问题c++

2015-05-05 20:36 246 查看
问题描述:一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(n个)按照1-m的顺序围坐一圈,从第1开始数,每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

解决1:使用数组存放

#define  Maxsize 1000
void jose(int n,int m)
{
int mon[Maxsize];
int i,d,count;
for (i=0;i<n;i++)
mon[i]=i+1;
cout<<"Befoue out:"<<endl;
for (i=0;i<n;i++)
cout<<mon[i]<<",";
cout<<endl;
cout<<"After out:"<<endl;
count=0;
i=-1;
//函数的实现
while(count<n)
{
d=0;
while(d<m)
{
i=(i+1)%n;
if (mon[i]!=0)
d++;
}
cout<<mon[i]<<",";
mon[i]=0;
count++;
}
cout<<endl;
}


解法二,使用循环链表

typedef struct LNode
{
int data;
struct LNode *link;
}LNode,*LinkList;
void jose(int n,int m)
{
LinkList p,pcur;
p=(LinkList)malloc(sizeof(LNode));
//第一只猴子单独拉出来了
p->data=1;
//循环单链表
p->link=p;
pcur=p;
for (int i=1;i<n;i++)
{
LinkList tmp=(LinkList)malloc(sizeof(LNode));
tmp->data=i+1;
tmp->link=pcur->link;
pcur->link=tmp;
pcur=tmp;
}
while(n--)
{
LinkList tmp;
for (int s=m-1;s--;tmp=p,p=p->link);
tmp->link=p->link;
cout<<p->data<<"->";
free(p);
p=tmp->link;
}
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: