/**
* <约瑟夫问题><br>
* <规则:从第二个开始报数,一共报三下,第三个报的人出去。如果从2开始,顺序为2、3、4 。那么4就要出去>
*
* @author snowday88
*/
public class ShouPa
{
private int[] shouPa;
// 要报的数
private int num;
public ShouPa(int size, int num)
{
shouPa = new int[size];
for (int i = 0; i < size; i++)
{
shouPa[i] = i + 1;
}
this.num = num;
}
// 获得最后一个出列的
public int getTheLast()
{
// 打印数组
printArray();
// 得到数组的长度
int length = shouPa.length;
// 定义index 从第二个数开始
int index = 1;
// 记录出列的个数
int chuLie = 0;
// 当数组只剩一个数的时候就停止循环
while ((chuLie + 1) != length)
{
// 报数三下
for (int i = 0; i < num; i++)
{
// 用来循环
int cursor = index + i;
// 判断是否越界了,如果越界就当作循环。
if (cursor > (length - 1))
{
cursor = (index + i) % (length - 1) - 1;
}
// 如果当前数组元素是0则跳到下一个
while (shouPa[cursor] == 0)
{
index++;
cursor = index + i;
if (index > length - 1)
{
index = (index % (length - 1)) - 1;
}
if (cursor > (length - 1))
{
cursor = (cursor) % (length - 1) - 1;
}
}
// 出列
if (i == 2)
{
// 出列的数置为0
shouPa[cursor] = 0;
// index为出列的下一数的位置
index = index + num;
if (index > length - 1)
{
index = (index % (length - 1)) - 1;
}
// 出列数加一
chuLie++;
}
}
}
// 得到最后一个数
for (int i = 0; i < shouPa.length; i++)
{
if (shouPa[i] > 0)
{
System.out.println();
System.out.print("最后出列的数是: ");
return shouPa[i];
}
}
return 0;
}
// 打印数组
public void printArray()
{
for (int i : shouPa)
{
System.out.print(i + " ");
}
}
public static void main(String[] args)
{
System.out.println(new ShouPa(7, 3).getTheLast());
}
}
java数组实现约瑟夫
最新推荐文章于 2024-07-27 13:31:57 发布