題目描述:圓形餐桌上有n個人,每個人都有乙個編號,順時針方向依次從1到n,由於是圓形餐桌,那麼第乙個編號和最後乙個編號n是相鄰而坐的。從編號1順時針開始1報數,每相鄰而坐的就加1。某編號x的人報數為m則出局離開餐桌,出局後不能參與後面的報數。x的順時針方向的相鄰的人則重新從1開始繼續報數
declare
--總人數
v_total number:=&v_total;
--對應的m
v_step number:=&v_step;
--剩餘的人數
v_surplus number;
--計數
v_count number:=0;
begin
--將資料插入到表中
for i in 1..v_total
loop
insert into temp values(i);
end loop;
v_surplus:=v_total;
while v_surplus>1 loop
--宣告乙個游標
declare
cursor c_temp
isselect * from temp;
c_row c_temp%rowtype;
begin
open c_temp;
loop
fetch c_temp into c_row;
exit when c_temp%notfound;
v_count:=v_count+1;
--判斷是否報到m的倍數,是則從表中刪除
if mod(v_count,v_step)=0 then
dbms_output.put_line(c_row.t_id);
delete from temp where t_id = c_row.t_id;
end if;
end loop;
close c_temp;
end;
--重新計算剩餘的人數
select count(*) into v_surplus from temp;
end loop;
commit;
end;
約瑟夫環實現
約瑟夫環問題,這是乙個很經典演算法,處理的關鍵是 偽鍊錶 問題描述 n個人圍成一圈,從第乙個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈 如此往復,直到所有人出圈。模擬此過程,輸出出圈的人的序號 1 2 3 4 5 6 7 8 3,6 出圈 剩下7 8 1 2 4 5 7 8...
約瑟夫環 VC 實現
問題描述 設編號為1,2,n n 0 的人按順時針方向圍坐一圈,每人持有乙個正整數密碼。開始時任意給出乙個報數上限值m,從第乙個人開始沿順時針方向自1起順序報數,報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人起重新自1起順序報數 如此下去,直到所有人全部出列為止...
約瑟夫環的實現
用迴圈鍊錶實現的,思路很簡單,只是要注意指標的修改,程式設計基礎差的容易出錯。約瑟夫環 迴圈鍊錶實現 author milo.wang date 2012 9 15 include using namespace std typedef struct node node,nodeptr void j...