劍指offer (45) 約瑟夫環問題

來源:互聯網
上載者:User

標籤:style   blog   color   width   問題   表   

題目:有編號從 1 到 n 的 n 個人坐成一圈報數,報到 m 的人出局,下一位再從 1 開始, 如此持續,直止剩下一位為止,報告此人的編號 X。輸入 n, m,求出 X

題解分析:

一開始有 n 個人,報到 m 的人出局後,如果我們從剛才出局的那人的下一位開始重新從 1 開始編號,原問題就轉化為了一個 n – 1 人的問題。

如下表所示:

原始編號 第一人出局後的編號
m + 1 1
m + 2 2
m + 3 3
... ...
m - 2 n - 2
m - 1 n - 1
m 已出局

老的編號 i 與新編號 j 之間的關係為:i = (j + m) % n ,其中“%”為取餘數運算。

顯然,這個過程可以不斷重複,n – 1 規模的問題可以繼續轉化為 n – 2 規模的問題、n – 3 規模的問題,直到最後只剩下一個人。

我們可以總結出如下遞推公式:

 

f(n) = (f(n – 1) + m) % n, (n > 1),其中 f(n) 為當場上還有 n 個人時某個在場的人的編號

當最後只剩下一個人時,這個人的編號顯然只能是 1 ,即 f(1) = 1,這時,我們可以根據上面的公式反推回去,推匯出當 n 個人都在場時他的編號。

int LastNumber(int n, int m) {    assert(n > 0 && m > 0);    int last = 0;    for (int i = 2; i <= n; ++i) {        last = (last + m) % i;    }    return last + 1;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.