設n=100,c=1,m=10.
(1)將1到n個人的序號存入壹維數組p中;
(2)若第i個人報數後出圈,則將p[i]置於數組的倒數第i個位置上,而原來第i+1個至倒數第i個元素依次向前移動壹個位置;
(3)重復第(2)步直至圈中只剩下p[1]為止。
部分源程序已給出。
請勿改動主函數main()和輸出數據函數writeDat()的內容。 #include <stdio.h>
#define N 100
#define S 1
#define M 10int p[100],n,s,m;
void WriteDat(void);void Josegh(void)
{}void main()
{
m=M;
n=N;
s=S;
Josegh();
WriteDat();
}void WriteDat(void)
{
int i;
FILE *fp;
fp=fopen("out.dat" ," w" );
for(i=N-1;i>=0;i--){
printf(" %4d" ,p[i]);
fprintf(fp," %4d" ,p[i]);
if(i % 10==0){
printf("\n" );
fprintf(fp, "\n" );
}
}
fclose(fp);
}
/* 註:題中第壹個for()循環是先對數組p賦初值。在第二個for()中用i來控制沒出圈的
總人數,s1=(s1+m-1)%i的作用是找出報數後出圈人的下標,其中對i求余的作用是使報
數按圈進行(即報到尾後又從頭報),該算法在很多題目中都用到。由於求余的作用當
報數正好到最後壹個時s1為0,故而要進行if(s1==0)的判斷。內嵌的for()循環是將出圈
以後的人依次往前移。*/
void Josegh(void)
{
int i,j,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;<br>if(s1==0)<br>s1=i;<br>w=p[s1-1];<br>for(j=s1;j<i;j++)<br>p[j-1]=p[j];<br>p[i-1]=w;<br>}
} 這的問題和這個壹樣,看看吧,應該能解決了