问题及代码:
/*
* Copyright(c) 2016, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:ysx.cpp
* 作 者:于苏显
* 完成日期:2016年10月9日
* 版 本 号:v1.0
*
* 问题描述: 一群猴子,编号是1,2,3 …m,这群猴子(m个)按照1-m的顺序围坐一圈。
从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
* 输入描述:m,n
* 程序输出:大王的猴子是几号
*/
#include <iostream>
using namespace std;
struct monkey
{
int num;
struct monkey *next;
};
int main()
{
int m,n,i,j,king;
monkey *p,*q,*head;
cin>>m>>n;
if(n==1) king=m;
else
{
head=p=new monkey;//循环链表
p->num=1;
for(i=2; i<=m; i++)
{
q=new monkey;
q->num=i;
p->next=q;
p=q;
}
p->next=head;
p=head;
for(i=0; i<m-1; i++) //筛选
{
for(j=1; j<n-1; j++)
p=p->next;
q=p->next;
p->next=q->next;
p=p->next;
delete q;
}
king=p->num;
delete p;
}
cout<<"猴王的编号为: "<<king<<endl;
return 0;
}
运行结果:
知识点总结:考察约瑟夫公式和循环单链表的应用。
学习心得:要熟练掌握约瑟夫公式和循环单链表的运用。