PL SQL實現約瑟夫環

2021-10-14 18:56:23 字數 1121 閱讀 5656

題目描述:圓形餐桌上有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...