猴子选大王
题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入输入两个整数n和m,1<=m<=n<=100。
输出输出猴王的编号
样例输入
8 3
样例输出
7
从一开始敲猴子选大王这个题,思路基本上是差不多,但是代码就不一样了,从复杂到简洁。也看了很多种代码,下面敲了个人认为很简洁的代码,如下:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n,i,x=0,t=0;
cin>>n;
int arr[n];
memset(arr,0,sizeof(arr));//重置数组为零
for(i=0;; i++) //1代表出局猴,0代表留下的猴
{
if(arr[i]==0)
t++;//t用来记录猴子序号
if(t==3)
{
arr[i]=1;//每当数到3,就另这个数组元素为1
x++;//X用来记录出局猴的数量
t=0;//当出局一个猴子,开始重新数,令t=0
}
if(i==n)
i=-1;//当i=n时,说明此时已经遍历过一遍,还剩大于1的猴子,令i=-1,for循环执行i++,重新开始数数
if(x==n-1)
break;//直至出局n-1个猴子,跳出for循环
}
for(i=0; i<n; i++)
{
if(arr[i]==0)
cout<<i+1<<endl;//数组从零开始,输出数组为零的数加一,即为大王
}
return 0;
}