请勿改动主函数main()和输出数据函数WriteDat()的内容。
题目解析:
void Josegh(void)
{
int t[100], /*t用来存放100个人的编号 */
i, /*用来遍历t数组中的编号,真正遍历的时候是用 i%n 做下标的*/
j, /*j用来计数,它从0开始,数到m后,又重新从0开始*/
k=0; /*用来负责向存放出圈顺序的数组p中放数,它用 k++ 做p的下标*/
[Page: ]
for(i=0;i
for(i=s-1,j=0;k
所以从0开始,k
的人已经全部出圈,所以程序结束。*/
{ if(t[i%n]!=-1) j++; /*如果数组t中的第(i%n)个元素不为-1,说明这里有人,应让j计数*/
if(j==m) /*如果j数到了m,说明有一个人应该出圈*/
{
p[k++]=t[i%n];/*把出圈人的顺序号写入p数组*/
t[i%n]=-1;/*出圈一个人,就把它的位置上放上-1,以标志该处没人,不能数数,应该跳过去*/
j=0;/*j已经数到m了,应该从0重新计数*/
}
}
}
注:(1)t数组的下标之所以用 (i%n)是为了让 i 循环指向数组的下标,因为i在一直增大,而(i%n)的变化范围是0->1->2.....->98->99->0->1....->98->99.......... i总是在这样变化,所以能一遍一遍的循环引用t数组的元素。
一般C语言中的结构,如for、if、while、do...while等都只能控制一条语句,如果逆向让他们控制多条语句,就必须把这多条语句用{}扩起来。至于什么时候控制多条语句,那得看题目而定了,没有规则。
例如:if(a>b) t=a;a=b;b=t;
这看起来好像是说:如果a大于b为真,则交换a和b得值,但不是,这时if结构只能控制t=a;这条语句。可以对比下一个结构:if(a>b) {t=a;a=b;b=t;} 这里就不一样了,这里得if结构控制得是复合语句{t=a;a=b;b=t;} ,相当于控制了三条语句。
再如:int i=0,sum=0;