十五个猴子围成一圈选大王,依次1-7 循环报数,报到7 的猴子被淘汰,直到最后一只猴子成为大王。问,哪只猴子最后能成为大王。
需求:
选出一个大王。
思路:
将15只猴子封装为数组,用1–15表示。因为需求是要求出一个大王,也就是说这个数组到最后只能存在一个元素,那么就要定义循环。让15只猴子轮流自1–7循环报数,而报数为7的元素则要被删除。显然1次循环不可能达到需求,那么就要定义一个内层循环完成报数和删除操作,直到该数组只存在一个元素为止。
这里需要注意一点,报数时并非是循环结束了报数也要重新开始,而是当一个元素报数为7时,其余元素再重新开始报数。即使已经进入另一次循环,也要接续上个元素报的数。
步骤:
1、定义int数组arr,长度为15,元素值为1–15即代表了15只猴子的编号。
2、定义计数器counter 值为0,用于报数,只要counter=7,就对该元素操作,并计数器归0。
3、定义while循环,循环表达式为:arr.length!=1,因为只能有一个大王。
4、定义计数器a,值为0,用于记录每次循环时,对arr操作了几次,也就是说用于记录每一次循环有多少元素报数为7。
5、定义for循环,循环表达式为I"<"arr.length;只要一进入循环counter++。
6、定义if语句判断counter是否为7,是则arr[i]=0,计数器=0,a++。
7、for循环结束后新建一个数组newarr,长度为arr.length-a。它是用于将arr的无效下标删除。(0为无效下标)。
8、定义计数器index,值为0。它是用于newarr的下标。
9、定义for循环用于遍历数组。,循环表达式为i“<”arr.length。
10、使用if语句判断arr[i]!=0,是则newarr[index++] = arr[i]。
11、for循环结束后,a=newa。
public class Test
{
public static void main(String[]args)
{
//功能:定义数组并向每个下标赋值
int[] arr = new int[15];
for(int i=0; i<arr.length; i++)
{
arr[i] = i;
}
//调用example方法,并由arr接收返回值
int[] arr = example(arr);
//打印arr[0]的原因:因为arr数组接收example的返回值后arr的长度为1。
System.out.println("大王是编号为:"+arr[0]+” 的猴子“)
}
public static int[] example(int[] arr)
{
int counter = 0;
while(arr.length!=1)
{
int a = 0;//用于记录每一次循环时对arr操作的次数
//功能:将报数为7的元素变成无效元素
for(int i=0; i<arr.length; i++)
{
counter++;
if(counter==7)
{
System.out.println("Test: 即将删除"+arr[i]);
arr[i] = 0;
counter = 0;
a++;
}
}
//功能:将arr中存储无效元素的下标删除
int[] newarr = new int[arr.length-a];
int index = 0;
for(int i=0; i<arr.length; i++)
{
if(arr[i]!=0)
{
newarr[index++] = arr[i];
}
}
arr = newarr;
}
renturn arr;
}
}