问题描述: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:77按跳下的次序结果船只会剩一个人: 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