早教吧 育儿知识 作业答案 考试题库 百科 知识分享

约瑟夫环c++.将1到m这m个自然数由小到大围成一圈,并建立一个循环双向链表.以1为起点,先沿顺时针方向每数到第n个数划去一个数(n),然后沿反时针方向每数到第k个数就划去一个数,这样一直

题目详情
约瑟夫环c++.
将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;
}
看了 约瑟夫环c++.将1到m这m...的网友还看了以下:

阅读下面文言文,回答问题孟子曰:“圣人,百世之师也,伯夷、柳下惠是也。故闻伯夷之风者,顽①夫廉,懦  2020-04-06 …

1、从立方运算的角度去思考,负数有没有立方根?2、对于求某数立方根的运算,在计算时我们需要注意些什  2020-05-02 …

算几个简单的立方根、用计算器-216的立方根的相反数27分之125的立方根的相反数-27的立方根的  2020-05-16 …

有个赶考的书生到旅店投宿,拿出十两银子,挑了该旅店标价十两银子的最好房间,店主立刻用它到隔壁的米店  2020-06-21 …

《信任》阅读短文回答问题.每次去威廉家的路上,总见一块立在公路边用大红漆写在黄色板上的告示:桃子—  2020-06-22 …

小黄人要在规定时间内制作果酱.凯文独立做可提前4天完成,戴夫则要晚6天完成,如果凯文和戴夫合做4天  2020-07-07 …

笔算立方根中的一个问题笔算立方根中.按方法.1.将被开立方数的整数部分从个位起向左每三位分为一组;  2020-07-20 …

材料一:出骞行时百余人,去十三岁,惟二人得还.材料二:大丈夫应立大志,像傅介子(西汉昭帝时出使楼兰  2020-07-23 …

约瑟夫环c++.将1到m这m个自然数由小到大围成一圈,并建立一个循环双向链表.以1为起点,先沿顺时  2020-07-29 …

语文问题每次去婆家的路上,总见一块立在公路边用大红漆写在黄色板上的告示:“桃子——自采——三里路”.  2020-11-14 …