1.约瑟夫问题(10分)

来源:百度知道 编辑:UC知道 时间:2024/05/23 18:18:41
1.约瑟夫问题(10分)
成绩: 10 / 折扣: 0.8

已知n个人(不妨分别以编号1,2,3,…,n 代表 )围坐在一张圆桌周围,编号为k 的人从1开始报数,数到m的那个人出列,他的下一个人又从 1开始继续报数,数到m的那个人出列,…,依此重复下去,直到圆桌周围的人全部出列。直到圆桌周围只剩一个人为止。

要求:

1,必须使用循环链表实现。

2,输入、输出格式如下:

输入: n,k,m

输出: 出列序列(以空格分隔)

3,不合法输入的对应输出如下:

a,输入:n、k、m任一个为0

输出:n,m,k must bigger than 0.

b,输入:k>n

输出:k should not bigger than n.

我用的vc++6.0
#include "iostream.h"
#include "stdio.h"

#define ElemType int

struct LNode
{
ElemType data;
LNode *next;
};

LNode *DeleteLNode(LNode *p,int k,LNode *head);

int main()
{
int n,m,k,i,j;
LNode *prev,*p,*head;
head->data=1;
prev=head;
i=0;

//input n,k,m
scanf("%d,%d,%d",&n,&k,&m);
if(0==n||0==m||k==0)
cout<<"n,m,k must bigger than 0./n";
el

我没有编译器,你看下面的可以么:
#include "iostream.h"

#define ElemType int

struct LNode
{
ElemType data;
LNode *next;
};

LNode *DeleteLNode(LNode *p)
{
LNode *e=p->next;
cout<<p->data<<" ";
delete p;
if(e==p)
return NULL;
return e;
}

int main()
{
int n,m,k,i,j;
LNode *prev,*p,*head;

//input n,k,m
cin>>n>>k>>m;
if(0==n||0==m||k==0)
cout<<"n,m,k must bigger than 0./n";
else if(n<k)
cout<<"k should not bigger than n/n";
else
{
//CreateList
head->data=1;
p=prev=head;
for(i=2;i<=n;i++)
{
LNode *p=new LNode;
p->data=i;
prev->next=p;
p=prev;
}
p->next=head;

j=1;
p=head;
while(p!=NULL)
{
if(j==k)
{