/*
*COPYRIGTH (c) 2017, YTU CS
*All rigth reserve
*作者:王铭泽
*完成日期:2017.10.19
*版本号:v1.0
*
*问题描述:群猴子,编号是1,2,3 …m,这群猴子(m个)按照1-m的顺序围坐一圈。从第1只开始数,每数到第n个,
该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。输入m和n,输出为大王的猴子是几号。
*注:所有代码除了标准命名外全为自己coding.
*/
#include<iostream>
using namespace std;
struct Monkey
{
int num;
struct Monkey *next;
};
int main(){
//出事输入
int m,n;
cout<<"请输出猴子个数和截止个数:"<<endl;
cin>>m>>n;
//建立圆圈
Monkey *p1,*p2,*head;
int i;
p2=p1=new Monkey;
head=p1;
for(i=1;i<m;i++)
{
p1=new Monkey;
p1->num=i+1;
p2->next=p1;
p2=p1;
}
p2->next=head;
//开始选大王
int king;
int j;
p1=head;
//共淘汰m-1只猴子次。
for(i=1;i<m;i++)
{
for(j=1;j<n-1;j++)
p1=p1->next;
p2=p1->next;
p1->next=p2->next;
p1=p2->next;
delete p2;
}
king=p1->num;
delete p1;
cout<<"猴子大王是名为:"<<king<<"的猴子"<<endl;
return 0;
}
本问题是经典问题,它问题在于对逻辑的要求,并且在单链表的运用上需要有一定功底。
结果: