问答题
设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下—个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编 设n=100,s=1,m=10进行编程。 注意:部分源程序已给出。 请勿改动主函数main()和写函数WritsDat()的内容。 试题程序: #include<stdio.h> #define N 100 #define S 1 #define M 10 int p[lOO],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 ( "OUT59. 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);
【正确答案】void Josegh(void) { int i, j,k,sl,w; s1=s; for (i=l; i<=n; i++) /*给n个人从到n编号*/ p[i-1]=i; for (i=n; i>=2; i--) { s1= (s1+m-1) %i; /*下一个开始报数的人的编号是(s1+m-1 )%i*/ if (s1==0) /*若s1为0,则说明要开始报数的是最后一个人*/ s1=i; w=p [s1-1]; /*将要出圈的人移至数组的最后*/ for (j=sl; j<=i-1; j++) p[j-1]=p[j]; p[i-1]=w; } }