题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入
输入两个整数n和m,1<=m<=n<=100。
输出
输出猴王的编号
样例输入
8 3
样例输出
7
看了别的题解全是指针链表,初学的小萌新确实没太看明白,自己写了一个感觉比较容易理解的,所以放出来吧
就是一个枚举的过程……
#include<stdio.h>
struct monkey
{
//用来存放每只猴子的编号
int ID;
};
int main()
{
int n,m,k=1;
struct monkey mon[102];
scanf("%d%d",&n,&m);
//分配ID 数组下标既ID
for(int i=1;i<=n;i++)
mon[i].ID=i;
//一直循环直到只剩下一只猴子
while(n>1)
{
//计算出局的ID if是防止n的倍数被取余为0
if((k+m-1)%n!=0)
k=(k+m-1)%n;
else
k=n;
//出局的实现 k后面的结构体全部往前移 猴子数减少一只
//因为出局之后k对应的猴子就是出局的下一只,所以只有k是最后一只的情况需要变动为1
for(int i=k;i<=n;i++)
mon[i]=mon[i+1];
n--;
if(k==n+1)
k=1;
}
//剩余的那只猴子的结构体数组下标必然为1
printf("%d",mon[1].ID);
return 0;
}