約瑟夫問(wèn)題規(guī)律討論

考慮這樣一個(gè)問(wèn)題,有 n 個(gè)人,標(biāo)號(hào)從 1n,從第一個(gè)人開(kāi)始數(shù),殺死數(shù)到 3 的人,然后下一個(gè)人重新開(kāi)始數(shù)。
問(wèn):最后死的人是幾號(hào)?

假設(shè)有 10 個(gè)人,將沒(méi)有被殺的人重新編號(hào),那么,殺人情況如下表所示

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22
23 24 25
26 27
28
29
30

第一輪殺了 3 號(hào)、6 號(hào)和 9 號(hào),1 號(hào)變成了 11 號(hào),2 號(hào)變成了 12 號(hào)等等。

我們可以發(fā)現(xiàn)如下性質(zhì):

  • 每一輪被殺的了人的編號(hào)是 3 的倍數(shù),且第 k 個(gè)被我要的殺的人的當(dāng)前輪的編號(hào)是 3k。
  • 3k 號(hào)被殺后,下一個(gè)被殺的人是 3k+3 號(hào),那么 3k+1 號(hào)和 3k+2 號(hào)是暫時(shí)安全的,因此需要對(duì)其編號(hào),其新的編號(hào)為 n + 2k + 1n + 2k + 2,因?yàn)闅⑼?3k 號(hào)后相當(dāng)于殺了 k 個(gè)人,還有 n - k 個(gè)人。

因此對(duì)于第 n 個(gè)被殺死的人,他死亡時(shí)編號(hào)為 N = 3n,又因?yàn)?N = n + 2k + 1N = n + 2k + 2,顯然 k = \lfloor \frac {N - n - 1} {2} \rfloor,而上一輪的編號(hào)為 N' = k + N - n。
因此可以用下面的方法算出最后一個(gè)死的人的原編號(hào)

int J(int n) {
    int i = 3 * n;
    while (i > n) i = (i - n - 1) / 2 + i - n;
    return i;
}

如果用 N = 3n + 1 - D 來(lái)替換 N,發(fā)現(xiàn)原迭代式變?yōu)?D = \lceil \frac {3}{2} D \rceil

則可以用以下方法求出上面要求的結(jié)果

int J(int n) {
    int i = 1;
    while (i <= 2*n) i = ceil(3.0 * i / 2);
    return 3*n + 1 - i;
}

當(dāng)然,如果循環(huán)節(jié)的個(gè)數(shù)不為 3,而是為 q,可以用相同的方法證明,有類似的結(jié)論

int J(int n, int q) {
    int i = 1;
    while (i <= (q - 1) * n) d = ceil((double)q * i / (q - 1));
    return q*n + 1 - i;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容