您的位置:首页 > 其它

猴子选大王(数组按顺序循环删除某个数)

2017-12-24 20:37 295 查看
有n只猴子围成一圈,每只猴子从1到n依次编号。猴子们打算从中选出一个大王,经过协商,决定出选大王的规则:从第一个猴子开始循环报数,数到m的猴子出圈,最后剩下来的就是大王。你的任务是计算哪一个编号的猴子成为大王。
输入与输出要求:首先输入两个整数n(1<=n<=100)和m(m<=n)。n代表猴子的总个数,m代表每轮报数的猴子数。输出第几只猴子是大王。
程序运行效果:
Sample
1:
7↙
3↙
4

#include<stdio.h>
int succ(int c);		//到达边界时,返回下一个猴子序号为1
int nextMonkey(int t);	// 返回下一个没有被排除的猴子的序号
int n,m;				//设置全局变量,便于在子函数中对数据的利用
int a[101];				//存储猴子的数量
int main(void)
{
int i,j,p,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
a[i]=1;			//初始值全都设为1,1表示猴子没被排除,0表示猴子已被排除
p=1;				//这里p表示从第一只猴子开始排除
for(i=1;i<n;i++)	//从1开始 ,循环n-1次
{
for(j=0;j<m-1;j++)//m为循环间隔
{
p=nextMonkey(p);}//将该轮到的猴子序号进行更新
a[p]=0;						//循环结束,选中猴子被淘汰,设为0
p=nextMonkey(p);			//开始下一次循环,将p更新到下一个没被淘汰的猴子上
}
printf("%d",p);				//循环彻底结束
return 0;
}
int succ(int t)
{
if(t==n)
return 1;//一环循环一圈,开始下一圈
return t+1;
}
int nextMonkey(int t)
{
int i;
i=succ(t);
while(a[i]!=1)	//判断猴子是否被淘汰
i=succ(i);//没被淘汰,直接更新到下一个猴子序号
return i;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: