约瑟夫问题

来源:互联网 发布:今年网络最流行歌曲 编辑:程序博客网 时间:2024/05/16 11:04
//包名审阅,根据自己的包的位置,写!写好后,本程序可以直接运行!
public class diu_shou_pa {
/**
* 2015年9月15日09:09:27
* 程序背景:丢手帕问题又叫做约瑟夫问题,
*        数学表示:这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,
*        必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,
*        如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒
*/


public static void main(String[] args) {
//给定固定的人数
String array [] = {"张1","张2","张3","张4","张5","张6","张7","张8","张9"};
//System.out.println(array.length);

//每次报数
int  temp=15;
   //因为原生态数组大小固定,所以不能删除空的,所以这个变量表示有多少废弃的数组,如果为2,说明最后两个数组为空,不使用!
   int null1=0;
   
   for(int i=0;i<4;i++){
    int temp1 = xia_biao(temp,array,null1);
null1 = yi_wei(array , temp1,null1);
for(int j=0; j<array.length;j++){
System.out.println("数组中第"+i+"个元素的内容"+array[j]);
}
System.out.println("=====一次循环结束================================================");
   }


}
//找出要删除的元素下标
public static int xia_biao(int temp, String array[],Integer null1){
//当while不成立的时候执行,temp-1就是要删除的人的位置
while(temp>(array.length-null1)){
temp=temp-(array.length-null1);   //算出来temp等于6,但是数组起始位置是0,所以要删除array【6-1】
}
return temp;
}

   //将数组移位的函数操作,参数:要移位的数组  要移除元素的下标
public static int yi_wei(String [] array ,int local,Integer null1){
while(local+1<=array.length){
array [local-1]=array [local];
++local;
}
++null1;
return null1;
}




}
1 0