新約瑟夫問題

2022-09-02 22:18:27 字數 1884 閱讀 6960

【問題描述】

(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個人為止。問怎樣排法,才能使每次...