问题描述:ps:原题不是去这样的,差不多是下面这样的
茫茫大海,生活着一群海盗,海盗们整日饮酒作乐悠哉游哉,海盗老大渐渐厌倦,提出要去出海寻找传说中的
one piece,海盗们一致同意出海寻宝,他们有黑珍珠号,世界上最快的船,可没想到他们来到了黑椒深林(礁石像树木),船破了30个海盗们惊慌了,这时船长
杰克 .斯派罗提出30个海盗从一开始数一直到数到七或者七的倍数就得跳船去寻找食物,当然跳下去的就会go die ,结果船长按照自己的想法,顺利地活下来,请问他是第几号海盗?
分析:相当于30个人坐成一圈,从一开始数,数到七就go die;
每次都会有人die,然后接着数,一直到最后一个最后一个肯定会活下来;
代码测试
import java.util.Scanner;
public class HaiDaoCircle {
HaiDaoCircle(){
}
//黑珍珠成员方法,参数传递总人数t,参数f传递数到的危险数值
public static void BlackPearl(int t,int f )
{
int mark[] =new int[t]; //0表示alive,1表示dead
int i =0;
int count = 0;
int ponit = f; //记录数到f
int killer = 0; //统计出列人数
while(killer < t)//循环总条件死亡者小于总人数
{
if(mark[i] == 0)//0表示可以继续活着
{
count++;
if(count == ponit)
{
System.out. printf("%8d(out)\n",i+1); //数到m的那个人出列,被推下船
mark[i] = 1; //标志位置1 并记住这个位置
killer++; //出列人数加1
count = 0; //计数清零重新开始报数
}
else
{
System.out.printf("%8d",i+1);//继续往下数
}
}
i++;
if(i == t) //人数继续下一循环
{
i = 0;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入被困在船上的海盗人数N");
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
// 提示输入要出圈的数值
System.out.println("请输入要跳下船去的数值M:");
int M = sc.nextInt();
System.out.println("按跳下的次序结果船只会剩一个人:");
HaiDaoCircle p1=new HaiDaoCircle();
p1.BlackPearl(N, M);
System.out.println("最后一个被输出的就是幸存者编号");
}
}
效果
请输入被困在船上的海盗人数N30
30
请输入要跳下船去的数值M:7
7
按跳下的次序结果船只会剩一个人:
1 2 3 4 5 6 7(out)
8 9 10 11 12 13 14(out)
15 16 17 18 19 20 21(out)
22 23 24 25 26 27 28(out)
29 30 1 2 3 4 5(out)
6 8 9 10 11 12 13(out)
15 16 17 18 19 20 22(out)
23 24 25 26 27 29 30(out)
1 2 3 4 6 8 9(out)
10 11 12 15 16 17 18(out)
19 20 23 24 25 26 27(out)
29 1 2 3 4 6 8(out)
10 11 12 15 16 17 19(out)
20 23 24 25 26 29 1(out)
2 3 4 6 10 11 12(out)
15 16 17 20 23 24 25(out)
26 29 2 3 4 6 10(out)
11 15 16 17 20 23 24(out)
26 29 2 3 4 6 11(out)
15 16 17 20 23 26 29(out)
2 3 4 6 15 16 17(out)
20 23 26 2 3 4 6(out)
15 16 20 23 26 2 3(out)
4 15 16 20 23 26 2(out)
4 15 16 20 23 26 4(out)
15 16 20 23 26 15 16(out)
20 23 26 15 20 23 26(out)
15 20 23 15 20 23 15(out)
20 23 20 23 20 23 20(out)
23 23 23 23 23 23 23(out)
最后一个被输出的就是幸存者编号
代码测试二:大佬写得
public class YueSFu {
static class YueSeFu
{
public static int circleRun(int person , int num)
{
int array[] = new int[person];
int flag = 0;
int person_flag=0;
//-----------------初始化数组--------------------
for (int i = 0; i < person ; i++ )
{
array[i] = i+1;
}
//----------------执行约瑟夫环规则---------------------
while(person>1)
{
for (int i = 1; i <= num ; i++, flag++ )
{
if (flag == array.length)
{
flag = 0;
}
while(array[flag]==0)
{
flag++;
if (flag == array.length)
{
flag = 0;
}
}
if (i==num )
{
array[flag] = 0;
person--;
}
}
}
//----------------遍历数组,不为零则返回--------------------
for (int i = 0; i<array.length ; i++ )
{
if (array[i]!=0 )
{
person_flag = array[i];
}
}
return person_flag;
}
public static void main(String[] args) {
System.out.println("最后一个人的编号为:"+ circleRun(30,7));
}
}
}
效果:
最后一个人的编号为:23
原文:https://www.cnblogs.com/nulinulizainuli/p/10532800.html