早教吧作业答案频道 -->其他-->
约瑟夫环c++.将1到m这m个自然数由小到大围成一圈,并建立一个循环双向链表.以1为起点,先沿顺时针方向每数到第n个数划去一个数(n),然后沿反时针方向每数到第k个数就划去一个数,这样一直
题目详情
约瑟夫环c++.
将1到m这m个自然数由小到大围成一圈,并建立一个循环双向链表.以1为起点,先沿顺时针方向每数到第n个数划去一个数(n),然后沿反时针方向每数到第k个数就划去一个数,这样一直进行下去,直到最后一个数为止,问最后是哪个数?请编制算法,完成上述功能.
将1到m这m个自然数由小到大围成一圈,并建立一个循环双向链表.以1为起点,先沿顺时针方向每数到第n个数划去一个数(n),然后沿反时针方向每数到第k个数就划去一个数,这样一直进行下去,直到最后一个数为止,问最后是哪个数?请编制算法,完成上述功能.
▼优质解答
答案和解析
这个只有第n个数划去一个数(n),反时针方向也是相同的道理.你可以参考下.
#include
#include
// 链表节点
typedef struct _RingNode
{
int pos; // 位置
struct _RingNode *next;
}RingNode, *RingNodePtr;
// 创建约瑟夫环,pHead:链表头指针,count:链表元素个数
void CreateRing(RingNodePtr pHead, int count)
{
RingNodePtr pCurr = NULL, pPrev = NULL;
int i = 1;
pPrev = pHead;
while(--count > 0)
{
pCurr = (RingNodePtr)malloc(sizeof(RingNode));
i++;
pCurr->pos = i;
pPrev->next = pCurr;
pPrev = pCurr;
}
pCurr->next = pHead; // 构成环状链表
}
void PrintRing(RingNodePtr pHead)
{
RingNodePtr pCurr;
printf("%d", pHead->pos);
pCurr = pHead->next;
while(pCurr != NULL)
{
if(pCurr->pos == 1)
break;
printf("\n%d", pCurr->pos);
pCurr = pCurr->next;
}
}
void KickFromRing(RingNodePtr pHead, int m)
{
RingNodePtr pCurr, pPrev;
int i = 1; // 计数
pCurr = pPrev = pHead;
while(pCurr != NULL)
{
if (i == m)
{
// 踢出环
printf("\n%d", pCurr->pos); // 显示出圈循序
pPrev->next = pCurr->next;
free(pCurr);
pCurr = pPrev->next;
i = 1;
}
pPrev = pCurr;
pCurr = pCurr->next;
if (pPrev == pCurr)
{
// 最后一个
printf("\n%d", pCurr->pos); // 显示出圈循序
free(pCurr);
break;
}
i++;
}
}
int main()
{
int m = 0, n = 0;
RingNodePtr pHead = NULL;
printf("---------------Josephus Ring---------------\n");
printf("N(person count) = ");
scanf("%d", &n);
printf("M(out number) = ");
scanf("%d", &m);
if(n next = NULL;
CreateRing(pHead, n);
#ifdef _DEBUG
PrintRing(pHead);
#endif
// 开始出圈
printf("\nKick Order: ");
KickFromRing(pHead, m);
printf("\n");
system("pause");
return 0;
}
#include
#include
// 链表节点
typedef struct _RingNode
{
int pos; // 位置
struct _RingNode *next;
}RingNode, *RingNodePtr;
// 创建约瑟夫环,pHead:链表头指针,count:链表元素个数
void CreateRing(RingNodePtr pHead, int count)
{
RingNodePtr pCurr = NULL, pPrev = NULL;
int i = 1;
pPrev = pHead;
while(--count > 0)
{
pCurr = (RingNodePtr)malloc(sizeof(RingNode));
i++;
pCurr->pos = i;
pPrev->next = pCurr;
pPrev = pCurr;
}
pCurr->next = pHead; // 构成环状链表
}
void PrintRing(RingNodePtr pHead)
{
RingNodePtr pCurr;
printf("%d", pHead->pos);
pCurr = pHead->next;
while(pCurr != NULL)
{
if(pCurr->pos == 1)
break;
printf("\n%d", pCurr->pos);
pCurr = pCurr->next;
}
}
void KickFromRing(RingNodePtr pHead, int m)
{
RingNodePtr pCurr, pPrev;
int i = 1; // 计数
pCurr = pPrev = pHead;
while(pCurr != NULL)
{
if (i == m)
{
// 踢出环
printf("\n%d", pCurr->pos); // 显示出圈循序
pPrev->next = pCurr->next;
free(pCurr);
pCurr = pPrev->next;
i = 1;
}
pPrev = pCurr;
pCurr = pCurr->next;
if (pPrev == pCurr)
{
// 最后一个
printf("\n%d", pCurr->pos); // 显示出圈循序
free(pCurr);
break;
}
i++;
}
}
int main()
{
int m = 0, n = 0;
RingNodePtr pHead = NULL;
printf("---------------Josephus Ring---------------\n");
printf("N(person count) = ");
scanf("%d", &n);
printf("M(out number) = ");
scanf("%d", &m);
if(n next = NULL;
CreateRing(pHead, n);
#ifdef _DEBUG
PrintRing(pHead);
#endif
// 开始出圈
printf("\nKick Order: ");
KickFromRing(pHead, m);
printf("\n");
system("pause");
return 0;
}
看了 约瑟夫环c++.将1到m这m...的网友还看了以下:
英语口语问题就是我想去个地方一个怎么问比如说我想去333教室.应该怎么问.可以这么问么.iwant 2020-05-14 …
一个推理题.某一旅行社发生凶案,警方迅速封锁现场.嫌疑人有ABCD.且断定(1)案发时间AB只有一 2020-05-23 …
人少的地方/人多的地方英语怎么说英语翻译.下面句子1我想去一个人多的地方/一个人少的地方,练练开车 2020-06-15 …
(抗美援朝战争的胜利)它雄辩地证明:西方侵略者几百年来只要在东方一个海岸上架起几尊大炮就可霸占一个 2020-06-18 …
一个猴子的帽子被风吹到了进里,他喊来8个小伙伴从井上方的树上一个接一个去捞帽子,可是还是够不着,于 2020-06-25 …
“西方殖民者几百年来只要在东方一个海岸线上架起几尊大炮就可霸占一个国家的时代是一去不复返了。”下列 2020-07-16 …
“我到北京去”类似的句式.我是主语,去是谓语,而到北京是状语么?“我到北京”是一个完整的句式,再加一 2020-11-07 …
住龙岩的郭老师一家要利用暑假的时间到国外旅游,儿子建议爸爸去一个比较湿润,又不很热的地方,请你帮忙选 2020-11-12 …
在地上放一个去掉灯罩的台灯,让发光的灯泡朝上。手里拿着一个放大镜,把它放在灯泡上方几厘米远的地方,然 2020-12-21 …
在地上放一个去掉灯罩的台灯,让发光的灯泡朝上,手里拿一个放大镜,把它放在灯泡上方距灯泡1cm远的地方 2020-12-21 …