一个关于约瑟夫环的算法问题

Description设n个人围坐在一圆桌周围,依次编号为1,2,...,n,从第s个人从1开始依次报数,数到m的人出列,然后从出列的下一个人重新开始报数,数到m的人又出... Description

设n个人围坐在一圆桌周围,依次编号为1,2,...,n,从第s个人从1开始依次报数,数到m的人出列,然后从出列的下一个人重新开始报数,数到m的人又出列,…,如此反复直到所有的人全部出列为止。对于任意给定的n,s和m,输出按出列次序得到的n个人员的序列。(数据结构问题,请分别用顺序表和链表解决此问题,并自编多组数据测试)

Input

人数n、第一个开始者的编号s以及报数出列编号m

Output

出列者的编号序列

Sample Input

8 1 4

Sample Output

4,8,5,2,1,3,7,6

Source
wangyongliang

我的代码OJ总是说不过,请各位大虾帮我看看哪出问题了谢谢
#include<stdio.h>
#include<iostream>
#include<malloc.h>

using namespace std;

typedef struct node
{
struct node *next;
long long data;
}NODE;

NODE *create(long long n)
{
NODE *p;
p = (NODE *) malloc (sizeof(NODE));
p->data = 1;
NODE *q = p;
for(long long i = 2;i<=n;i++)
{
q->next = (NODE *) malloc (sizeof(NODE));
q = q->next;
q->data = i;
}
q->next = p;
return p;
}

NODE *DO(NODE *p,long long n,long long s,long long m)
{
for(long long i = 1;i< n + s-1;i++)
{
p = p->next;
}
for(;n>=1;n--)
{
if(n == 1)
printf("%d",p->data);
else
{
for(long long i = 1;i<m;i++)
{
p = p->next;
}
NODE *q = p;
printf("%d ",p->next->data);
p->next = p->next->next;
}
}
return p;
}

int main()
{
long long n,s,m;
scanf("%I64d %I64d %I64d",&n,&s,&m);
NODE *p = create(n);
NODE *q = DO(p,n,s,m);
return 0;
}
展开
 我来答
知识海洋的小学徒
2010-07-07 · TA获得超过890个赞
知道小有建树答主
回答量:278
采纳率:0%
帮助的人:459万
展开全部
约瑟夫问题:
#include<iostream.h>
struct Node
{
int data;
Node *pNext;
};

void main()
{
int n,k,m,i;
Node *p,*q,*head;
cout<<"输入n的值:";
cin>>n;
cout<<"输入起始报数人号码k的值:";
cin>>k;
cout<<"输入 数到m出列的m的值:";
cin>>m;
head=(Node*)new Node; //确定头结点
p=head;
for(i=1;i<=n-1;i++) //赋初值
{
p->data=i;
p->pNext=(Node*)new Node; //为下一个新建内存
p=p->pNext;
}
p->data=n; //最后一个单独处理
p->pNext=head; //指向头,形成循环链表
p=head;

while(p->data!=(p->pNext)->data) //p->data==(p->pNext)->data表示只剩下一个结点的
{
while(p->data !=k) //寻找编号为k的结点
p=p->pNext;
if(m==1)
{
for(i=1;i<=n;i++)
{
cout<<p->data<<'\t' ;
p=p->pNext ;
}
cout<<'\n';
return;
}
else
for(i=1;i<m-1;i++) //开始报数
{p=p->pNext;} //找到报m-1的结点

q=p->pNext; //q为报m的结点
cout<<q->data<<"\t"; //输出报m的结点的值
k=(q->pNext)->data; //k为下一个报数的起点
p->pNext=q->pNext; //删除报m的结点
}
cout<<p->data<<'\n'; //输出最后一个结点的值
}
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式