報數遊戲(約瑟夫環問題)

2021-10-02 10:43:52 字數 1451 閱讀 7908

題目描述:

有n個小朋友做遊戲,他們的編號分別是1,2,3…n。他們按照編號從小到大依次順時針圍成乙個圓圈,第乙個小朋友從1開始報數,依次按照順時針方向報數(報數的值加一),每個報m的人會離開隊伍,然後下乙個小朋友會繼續從1開始報數,直到只剩下乙個小朋友為止。

求最後一位小朋友的編號。

input

輸入兩個數字n,m(1<=m<=n<100000),用空格隔開。

output

輸出最後乙個小朋友的編號,獨佔一行。

sample input 1

7 5sample output 1

仔細分析,用陣列,迴圈解決:

#include

#include

intmain()

int t=

0,num=n;

//計數變數

for(i=1;

;i++)if

(num==1)

//只剩一人跳出迴圈

break;}

//找出最後剩餘的一位輸出來

for(i=

0;ireturn0;

}

#include

#include

typedef

struct list

list;

intmain()

q->next = l->next;

//讓尾結點指向頭結點的下乙個,即第乙個人的位置,單向迴圈鍊錶建立完成

q = l->next;

//讓q指向頭結點的下乙個

while

(q->next != q)

//只剩乙個元素時,退出迴圈

//q指向刪除節點的前乙個

s = q->next;

//s指向刪除節點

q->next = s->next;

//將去除s後的鍊錶重新連線起來

q = q->next;

//讓q指向下次迴圈的起始位置

//printf("%d ", s->data);

free

(s);

s =null;}

printf (

"%d\n"

, q->data)

;free

(q);

q =null

;free

(l);

l =null

;return0;

}

後來還有大佬寫出迄今為止看到的最短小版本 tql:

#include

intmain()

printf

("%d\n"

, s+1)

;return0;

}

報數問題(約瑟夫環)

解法一 用陣列模擬 include using namespace std intmain sign 實際標號的 if sign 0 sign n 1 if i n 1 cout loop sign 0 return0 解法二 從位置考慮,舉例說 nnum 5 move 212 3453 4515 ...

約瑟夫環問題(報數問題)

先說一下什麼是約瑟夫環問題,這是百科的解釋 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。思路 因為n...

約瑟夫環的實現《報數遊戲》

面試中經常會被問到報數遊戲。遂實現一下。問題描述 設有n個人圍坐一圈並按順時針方向從1到n編號,從第s個人開始進行1到m報數,報數到第m個人時,此人出圈,再從他的下乙個人重新開始1到m的報數,如此進行下去直到所有的人都出圈為止。現要列印出出圈次序。輸入 n 遊戲總人數 s 報數的起始編號 m 報數的...