迴圈報數問題

2021-04-07 05:58:45 字數 858 閱讀 2525

/*

有n個人按照1到n編號圍成乙個圈做遊戲,從第乙個人開始從1報數,數到m的人退出遊戲,他後面的人接著重新從1開始報數.問最後剩下的人是幾號?

這個問題被稱為約瑟夫(josephus)環問題。

最容易想到的方法是用乙個迴圈鍊錶來模擬遊戲,直到最後只剩下1人.則可得到他的號碼.

這種演算法的空間複雜度是 o(n)

時間複雜度是 o(n*m)

下面給出一種演算法,空間複雜度為 o(1),時間複雜度為 o(n)

這裡只考慮m>=2的情況.

設總數為n的時候j(n,m)

則在總數是 n+1 的時候,第一次數到m,將減去1,以後的過程將和總數為n的情況一樣。

所以 j(n+1,m) = (m+j(n,m))%(n+1)

這裡的結果以0為基數,轉換成以1為基數josephus(m,n) = j(m,n) + 1;

顯然:

如果 n=1 最後剩下的就是1號

所以josephus(1,m) = 1

j(1,m) = 0

示例程式:

*/#include "stdafx.h"

long josephus1(long n,long m);

long josephus2(long n,long m);

int _tmain(int argc, _tchar* argv)

//用迴圈

long j1(long n,long m)

return k;

}long josephus1(long n,long m)

// 用第歸

long j2(long n,long m)

long josephus2(long n,long m)

n個人迴圈報數1 3問題

主要的思路見下圖 我相信只要大家吧自己的思路理清楚了,實現就簡單了。以下給出 public class test public static int getlastname int num return getlastname aa static arraylistnewlist public st...

queue求解迴圈報數刪除問題

因為剛使用queue物件,所以先記錄一下基本用法方便複習 q.empty 判斷佇列是否為空,空返回true,非空返回false q.size 返回佇列中元素的個數 q.pop 直接刪除隊首元素,沒有返回值 q.push 在隊尾壓入 q.front 返回隊首元素 q.back 返回隊尾元素 可以使用佇...

迴圈單鏈表解決迴圈報數問題

有n n 1 個人圍成一圈迴圈報數,每次報到3就出列,剩下的人繼續從1開始報數,直至只剩乙個人,求剩下那乙個人的原始編號。include using namespace std typedef struct node linklist void baoshu int m r next l 尾節點指向...