N围圈数数出圈

问题描述:

有n个人围城一圈,并从1到n编号,从第m个人开始报数,报到k的人出圈,下一个人继续从1开始报数,再报到k的人出圈,直到最后只剩下一个人。问最后剩下的这个人是几号。

分析:

  1. 用数组来存储每个人的编号,a[0]=1,a[1]=2,。。。,a[n-1]=n。
  2. 定义出圈人数为outCircle,每出圈一个人,outCircle++,当outCircle=n-1时,说明就剩下一个人了。
  3. 怎么定义出圈?当有人要出圈时,便把他的编号置为0,不再参与报数。
  4. 定义count变量作为计数器,每次出圈一人,count++;
  5. 当count==k时,则出圈一个人,count=0,重新计数;

int getLastOne(int n,int start,int target)
{
	int *array=new int[n];
	int count=0;//报数
	int outCircle=0;//出圈人数
	//首先给圈内人编号
	int i;
	for (i=0;i<n;i++)
	{
		array[i]=i+1;
	}
	//循环报数,第3个人数出圈,将出圈的人的编号置为0;
	i=start-1;
	while (outCircle<n-1)//当outCircle=n-1,即圈内只剩下一个人时,跳出循环
	{
		if (array[i]!=0)//开始报数
		{
			count++;
			if (count==target)//则这个人出圈
			{
				array[i]=0;
				outCircle++;//圈外人数加1
				count=0;//重新报数
			}
		}
		i++;
		if (i==n)//如果到最后一个人,则重新开始
			i=0;
	}
	for (i=0;i<n;i++)
	{
		if (array[i]!=0)
		{
			return array[i];
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值