
约瑟夫问题c语言
这是一道C语言的约瑟夫问题。M个人围成一圈,从第一个人开始依次从1循环报数,每当报数为N时此人从圈中出来,下一个人又从1开始报数,直到圈中只剩下一个人为止。请按退出次序输...
这是一道C语言的约瑟夫问题。
M个人围成一圈,从第一个人开始依次从1循环报数,每当报数为N时此人从圈中出
来,下一个人又从1开始报数,直到圈中只剩下一个人为止。请按退出次序输出出圈人员来
的编号以及留在圈中的最后一个人原来的编号。
提示:
1、声明两个数组,A数组存放人是否在圈中的标记,在为0,已出列为-1;B数组存放
编号,是顺序记录出圈人的顺序,最后一个即为留在圈中的人。组成圈的人数为M,报号
为N。
2、 A数组因为是表示一个圈,所以最后一个接着第一个,当编号大于最后一个编号
时,接到前面开始部分。当下标号为M时,让其再变为0,下标号为M以后相当于0开始的
又一圈开始。
小弟的C语言水平有限,不知道该怎么做,希望各位C语言高手指点迷津,小弟感激不
尽!
题目不是有说明了 要用数组
不要用链表 展开
M个人围成一圈,从第一个人开始依次从1循环报数,每当报数为N时此人从圈中出
来,下一个人又从1开始报数,直到圈中只剩下一个人为止。请按退出次序输出出圈人员来
的编号以及留在圈中的最后一个人原来的编号。
提示:
1、声明两个数组,A数组存放人是否在圈中的标记,在为0,已出列为-1;B数组存放
编号,是顺序记录出圈人的顺序,最后一个即为留在圈中的人。组成圈的人数为M,报号
为N。
2、 A数组因为是表示一个圈,所以最后一个接着第一个,当编号大于最后一个编号
时,接到前面开始部分。当下标号为M时,让其再变为0,下标号为M以后相当于0开始的
又一圈开始。
小弟的C语言水平有限,不知道该怎么做,希望各位C语言高手指点迷津,小弟感激不
尽!
题目不是有说明了 要用数组
不要用链表 展开
展开全部
我这有个类似的,你根据你的需求改一下就可以了
—————————————————————————
#include<stdio.h>
#include<malloc.h>
typedef
struct
tagRing_t
{
int
Num;
struct
tagRing_t
*pnext;
}Ring_t;
int
InitRing(Ring_t
**pstRing)
{
*pstRing
=
(Ring_t
*)malloc(sizeof(Ring_t));
if
(NULL
==
*pstRing)
{
return
0;
}
(*pstRing)->Num
=
1;
(*pstRing)->pnext
=
*pstRing;
return
1;
}
int
CreateRing(Ring_t
**pstRing,
int
iNum)
{
int
i
=
0;
Ring_t
*pstTemp
=
NULL,
*pst
=
NULL;
if
(iNum
<
1)
{
return
0;
}
pstTemp
=
*pstRing;
for
(i
=
0;
i
<
iNum;
i++)
{
if
(0
==
i)
{
(*pstRing)->Num
=
1;
}
else
{
pst
=
(Ring_t
*)malloc(sizeof(Ring_t));
if
(NULL
==
pst)
{
return
0;
}
pst->Num
=
i
+
1;
pstTemp->pnext
=
pst;
pst->pnext
=
*pstRing;
pstTemp
=
pstTemp->pnext;
}
}
return
1;
}
int
DeleteNode(Ring_t
**pstRing,
int
s,
int
iNum)
{
int
i
=
0;
Ring_t
*pstTemp
=
*pstRing,
*pst
=
NULL;
while
(pstTemp->pnext
!=
*pstRing)
{
pstTemp
=
pstTemp->pnext;
}
for
(i
=
1;
i
<
s;
i++)
{
pstTemp
=
pstTemp->pnext;
}
while
(pstTemp->pnext
!=
pstTemp)
{
for
(i
=
1;
i
<
iNum;
i++)
{
pstTemp
=
pstTemp->pnext;
}
pst
=
pstTemp->pnext;
pstTemp->pnext
=
pst->pnext;
printf("
%d
",
pst->Num);
free
(pst);
pst
=
NULL;
}
printf("
%d\
",
pstTemp->Num);
free
(pstTemp);
pstTemp
=
NULL;
return
1;
}
int
main()
{
Ring_t
*pstRing
=
NULL;
int
n
=
0,
s
=
0,
m
=
0;
InitRing(&pstRing);
printf("请输入n,
s
和
m的值:");
scanf("%d
%d
%d",
&n,
&s,
&m);
CreateRing(&pstRing,
n);
printf("出列顺序为:
");
DeleteNode(&pstRing,
s,
m);
return
1;
}
—————————————————————————
#include<stdio.h>
#include<malloc.h>
typedef
struct
tagRing_t
{
int
Num;
struct
tagRing_t
*pnext;
}Ring_t;
int
InitRing(Ring_t
**pstRing)
{
*pstRing
=
(Ring_t
*)malloc(sizeof(Ring_t));
if
(NULL
==
*pstRing)
{
return
0;
}
(*pstRing)->Num
=
1;
(*pstRing)->pnext
=
*pstRing;
return
1;
}
int
CreateRing(Ring_t
**pstRing,
int
iNum)
{
int
i
=
0;
Ring_t
*pstTemp
=
NULL,
*pst
=
NULL;
if
(iNum
<
1)
{
return
0;
}
pstTemp
=
*pstRing;
for
(i
=
0;
i
<
iNum;
i++)
{
if
(0
==
i)
{
(*pstRing)->Num
=
1;
}
else
{
pst
=
(Ring_t
*)malloc(sizeof(Ring_t));
if
(NULL
==
pst)
{
return
0;
}
pst->Num
=
i
+
1;
pstTemp->pnext
=
pst;
pst->pnext
=
*pstRing;
pstTemp
=
pstTemp->pnext;
}
}
return
1;
}
int
DeleteNode(Ring_t
**pstRing,
int
s,
int
iNum)
{
int
i
=
0;
Ring_t
*pstTemp
=
*pstRing,
*pst
=
NULL;
while
(pstTemp->pnext
!=
*pstRing)
{
pstTemp
=
pstTemp->pnext;
}
for
(i
=
1;
i
<
s;
i++)
{
pstTemp
=
pstTemp->pnext;
}
while
(pstTemp->pnext
!=
pstTemp)
{
for
(i
=
1;
i
<
iNum;
i++)
{
pstTemp
=
pstTemp->pnext;
}
pst
=
pstTemp->pnext;
pstTemp->pnext
=
pst->pnext;
printf("
%d
",
pst->Num);
free
(pst);
pst
=
NULL;
}
printf("
%d\
",
pstTemp->Num);
free
(pstTemp);
pstTemp
=
NULL;
return
1;
}
int
main()
{
Ring_t
*pstRing
=
NULL;
int
n
=
0,
s
=
0,
m
=
0;
InitRing(&pstRing);
printf("请输入n,
s
和
m的值:");
scanf("%d
%d
%d",
&n,
&s,
&m);
CreateRing(&pstRing,
n);
printf("出列顺序为:
");
DeleteNode(&pstRing,
s,
m);
return
1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
循环链表。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询