约瑟夫,数组。有2条语句求解释一下。
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出
圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。
请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出
到文件JOSE.OUT中。
这里给出另一种算法,分析:
设 n = 100, s = 1,m = 10。
(1) 将1到n个人的序号存入一维数组p中;
(2) 若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个
元素依次向前移动一个位置;
(3) 重复第(2)步直至圈中只剩下p[1]为止。
注意:部分源程序存放在文件prog1.c中。
最近备考三级网络,有条C语言的题,请各位大大帮忙解释一下语句,谢谢。
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100], n, s, m;
void WriteDat(void);
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;
/*这里用s1=(s1+m-1)已经可以踢人出局了,为什么要加个%i求模呢???*/
if (s1 == 0)
/*求模之后,这里判断s1为0,除了s1=i之外,在什么情况下会为0呢?为什么求模为0后要将i的值赋给S1*/
s1 = i;
w = p[s1-1];
for (j=s1; j<=i-1; j++)
p[j-1] = p[j];
p[i-1] = w;
}
}
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);
}