【問題描述】
(newnumber.pas/c/cpp)將1
~m這m
個自然數按由小到大的順序沿順時針圍成一圈。以
s為起點,先沿順時針方向數到第
n個數就出圈,然後再沿逆時針方向數到第
k個數再出圈,再沿順時針方向數到第
n個數就出圈,然後再沿逆時針方向數到第
k個數再出圈,
……。這樣按順時針方向和逆時針方向不斷出圈,直到全部數出完圈為止。列印先後出圈的數的序列0。
【輸入格式】
newnumber.in
檔案中共
4行,每行為
1個自然數,分別表示題目中的m,
s,n,
k。m不超過
1000
。【輸出格式】
newnumber.out
僅一行,先後出圈的序列,每個數字之間有乙個空格。
【樣例輸入】81
32【樣例輸出】
3 1 5 2 7 4 6 8
(解釋:先從
1開始沿順時針方向數到
3,所以
3先出圈;再從
2開始沿逆時針方向數到1,所以
1出圈;再從
2開始沿順時針方向數到
5,所以
5出圈;再從
4開始沿逆時針方向數到
2,所以
2出圈,……)
**typexx=
record
l,r:integer;
end;
varm,s,n,k,i,j,sum:integer;
a:array[1
..1000
] of
xx;begin
assign(input,
'newnumber.in
'); reset(input);
assign(output,
'newnumber.out
'); rewrite(output);
readln(m);
readln(s);
readln(n);
readln(k);
fori:=2
tom-1
dobegin
a[i].l:=i
-1;a[i].r:=i
+1;end;a[
1].l:
=m;a[
1].r:=2
;a[m].l:=m
-1;a[m].r:=1
;sum:=m;
j:=a[s].l;
while
sum>0do
begin
fori:=1
ton
doj:
=a[j].r;
ifsum=1
then
write(j)
else
write(j,''
);a[a[j].l].r:
=a[j].r;
a[a[j].r].l:
=a[j].l;
sum:
=sum-1
;
ifsum=0
then
exit;
fori:=1
tok
doj:
=a[j].l;
ifsum=1
then
write(j)
else
write(j,''
);a[a[j].l].r:
=a[j].r;
a[a[j].r].l:
=a[j].l;
sum:
=sum-1
;end
;close(input); close(output);
end.
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...