?? 題目57出圈問題.txt
字號:
題目57:設有n個人圍坐一圈并按順時針方向從1到n編號,從第s個人開始進行1到m的報數,報數到第個m人,此人出圈,再從他的下一個人重新開始1到m的報數,如此進行下去直到所有的人都出圈為止。現要求按出圈次序,每10人一組,給出這n個人的順序表。請考生編制函數Josegh()實現此功能并調用函數WriteDat()把結果p輸出到文件OUT.DAT中。
設n=100,s=1,m=10.
(1)將1到n個人的序號存入一維數組p中;
(2)若第i個人報數后出圈,則將p[i]置于數組的倒數第i個位置上,而原來第i+1個至倒數第i個元素依次向前移動一個位置;
(3)重復第(2)步直至圈中只剩下p[1]為止。
部分源程序已給出。
請勿改動主函數main()和輸出數據函數writeDat()的內容。
-------------------
void Josegh(void) /*標準答案*/
{int I,j,k,s1,w;
s1=s;
for(I=1;I<=n;I++) p[I-1]=I;
for(I=n;I>=2;I--)
{s1=(s1+m-1)%I;
if (s1==0) s1=I;
w=p[s1-1];
for(j=s1;j<=I-1;j++) p[j-1]=p[j];
p[I-1]=w;}
}
注:題中第一個for()循環是先對數組p賦初值。在第二個for()中用i來控制沒出圈的
總人數,s1=(s1+m-1)%i的作用是找出報數后出圈人的下標,其中對i求余的作用是使報
數按圈進行(即報到尾后又從頭報),該算法在很多題目中都用到。由于求余的作用當
報數正好到最后一個時s1為0,故而要進行if(s1==0)的判斷。內嵌的for()循環是將出圈
以后的人依次往前移。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -