问题:14个人手拉手围成一圈,每个人的序号分别是1-14,开始报数字1-3,喊道3的人退出圈子,问最后剩下的那个人是谁
该题代码如下:
方法一:
Console.WriteLine("请输入多少个人参加游戏");
int people = int.Parse(Console.ReadLine());
int[] arr = new int[people]; //定义一个十四个人的数组
int num = 0; //记录数字1-3
int i = 0; //记录i增加
int count = 1; //记录出局的人数
while (count < people) //出局人数达到就结束
{ // i取模于14是让他多次从0-13循环
if (arr[i % people] == 0) //arr初始值均为0,当arr数组中的数值为1的时候不计数,只记数没有被淘汰的
{
num++; //计数+1
}
if (num == 3)
{
arr[i % people] = 1; //点到3的出局
num = 0; //重新计数
count++; //出局人数加一
}
i++;
}
for (int j = 0; j < arr.Length; j++)
{
if (arr[j] == 0) //未出局的人
{
Console.Write("最后剩余的人是");
Console.WriteLine("第" + (j + 1) + "位");
}
}
输出结果:
方法二:
int num = 14;
int[] arr = new int[num];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = i + 1;
}
int index = 0; //下标
int n = 1; //计数1-3
int count = 0; //记录淘汰的人数
while (true)
{
if (arr[index]<0) //淘汰的人不参与循环,不进行记数1-3
{
index++; //但是下标依旧往下进行
if (index >= num) //如果下标超出范围,则返回第一个,组成一个圆圈
{
index = 0;
}
continue; //循环继续
}
if (n==3) //当计数为3的时候,淘汰,即让他值不为原先的数,以此来判断
{
arr[index] = -1;
count++;
}
if (count==13) //当淘汰的人数达到13人时,结束循环
{
break;
}
n++; //计数持续进行
if (n>3) //当超出3时,重新计数1
{
n = 1;
}
index++; //下标持续增加
if (index>=num) //当下标超出范围时,下标归0。
{
index = 0;
}
}
for (int i = 0; i < arr.Length; i++) //输出数组内的所有数字,不是-1的即为最后的那个人
{
Console.WriteLine(arr[i]);
}
第二种方法的改进:代码如下
int num = 14;
int[] arr = new int[num];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = i + 1;
}
int index = 0; //下标
int n = 1; //计数1-3
int count = 0; //记录淘汰的人数
while (true)
{
if (arr[index]>0) //只有不淘汰的人进行循环
{
if (n==3) //当计数为3的时候,淘汰,即让他值不为原先的数,以此来判断
{
arr[index] = -1;
count++;
}
if (count==13) //当淘汰的人数达到13人时,结束循环
{
break;
}
n++; //计数持续进行
if (n>3) //当超出3时,重新计数1
{
n = 1;
}
}
index++; //下标持续增加
if (index>=num) //当下标超出范围时,下标归0。
{
index = 0;
}
}
for (int i = 0; i < arr.Length; i++) //输出数组内的所有数字,不是-1的即为最后的那个人
{
Console.WriteLine(arr[i]);
}
运行结果:
该题注意的地方为:
1.当使用第一个代码时需要注意的地方是,理解i%people这个点,该点是让下标不能超过数组的界限,当i=0时,同样可以运行,运行结果为下标0。
2.第一个代码也可以带入数值,但是没有必要,当点到3时,数组的值为1,为1即为淘汰;
3.第二个代码需要注意的地方为continue的用法,continue的用法为在循环语句中,continue只执行到该行代码,不执行下面的代码,但依旧进行下一次的循环。
4.还有下标和报数1-3,记得需要回归原来的数字,不能超出范围;
5.第二个代码的改进需要注意的点为是当数组的值大于0时才运行,因为刚开始的时候给其赋值了,淘汰的均为-1,所以说大于0能够往下运行,该地方还要注意的是,if判断的位置不包括下面的index++;因为无论是否进行计数,下标依旧在持续增加。
6.细心细心再细心,逻辑逻辑再逻辑。