題目描述:有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 報數的...