设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止
现要求按出圈次序,给出这n个人的顺序表p
请考生编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈的顺序输出到OUT.DAT文件中
注意:第1个出圈的编号存放在p[0]中,第2个出圈的编号存放在p[1]中,直至第n个出圈的编号存放在p[n-1]中
设 n = 100, s = 1, m = 10进行编程
注意: 部分源程序存放在PROG1.C中
请勿改动主函数main()和输出数据函数WriteDat()的内容
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int 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, j = 0 ;
FILE *fp ;
fp = fopen(\"out.dat\", \"w\") ;
for(i = 0 ; i <= N - 1 ; i++) {
printf(\"%4d \", p) ;
fprintf(fp, \"%4d\", p) ;
j++ ;
if(j % 10 == 0) {
printf(\"\\n\") ;
fprintf(fp, \"\\n\") ;
}
}
fclose(fp) ;
}
答案是这样的
int i,j,s1,w,q[100];
for(i=0;i<n;i++)q=0;
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; j++)p[j-1]=p[j];
p[i-1]=w;
}
不理解为什么下一个开始报数的编号是(s1+m-1)%i.比如当i=100时
s1=(1+10-1)%100=10
但是报数是从1开始报
编号为10的人数到10他是第一个出圈的人
下面接着重新开始报数的应该是编号为11的人啊
请问为什么应该是(s1+m-1)%i这个表达式呢? |