java 约瑟夫(josephus)问题_Java-約瑟夫問題(Josephus Problem)

題目:

據說着名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人 開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。

然而Josephus 和他的朋友並不想遵從,Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡游戲。

最后一個自殺的是在第31個位置,而倒數第二個自殺的要排在第16個位置,之前的人都死光了,所以他們也就不知道約琴夫與他的朋友並沒有遵守游戲規則了。

思路:

/*** 思路:在循環處理的時候,數組保持長度不變,增加三個變量,* i作為循環遍歷參數,超出數組長度則重置為0;* num,作為有效數字長度,每減一個數字,num--;* flag,滿三減一,將需要減去的數字置位0;*/

public class Main {

public static void main(String[] args) {

int list[] = new int[41];

for (int i = 0; i < 41; i++) {

list[i] = (i + 1);

}

int i = 0, num = 41, flag = 0;

while (num > 2) {

//有效數字

if (list[i]!=0) {

flag++;

if (flag == 3) {

list[i] = 0;num--;flag = 0;

}

}

i++;

if (i >= list.length) {i = 0;}

}

for (i = 0; i < list.length; i++) {

if (list[i]==0) continue;

System.out.print(list[i] + " ");

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值