15只猴子依次报数,报到7的猴子就退出,求最后剩下的那只猴子?
方法一:这种方法可以得到从头至尾依次被淘汰猴子的序列。
public class Monkey {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []num={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int monkey=1,sum=15,number=1;
int p;
while(1==1)
{
if(number==7)//当报的数是第七个的时候,选出此时的猴子,并移动位置
{
if(monkey<sum)
{
for(int i=0;i<(sum-monkey);i++)
{
p=num[monkey+i-1];
num[monkey+i-1]=num[monkey+i];
num[monkey+i]=p;
}
}
monkey=monkey-1;
sum=sum-1;
}
monkey++;
number++;
if(monkey==(sum+1))monkey=1;//猴子数目在0到最大数目间循环
if(number==8)number=1;//报数在0到7间循环
if(sum==1)
{
System.out.println("最后选出来的大王是:"+num[0]+"号");
break;
}
}
System.out.println();
for(int j=14,m=1;j>=0;j--,m++)
System.out.println("第"+m+"只被out的猴子是:"+num[j]+"号");
}
}
方法二:这种方法比第一种方法简单
public static void main(String[] args) {
int[] d=new int[15];
int count=0; //排除的数量
int key=0; //剩下的数据索引
int i=0,index=0;//报数计数器、数组下标索引
while(count<d.length-1)
{
if(d[index]==0)
{
i++;
if(i==7)
{
d[index]=1;
count++;
i=0;
}
else
key=index;
}
index++;
if(index==d.length)index=0;
}
System.out.print("大王是第"+(key+1)+"只猴子!");
}