设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈
设有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; } } 解析:本题考查的知识点如下:
(1)将数组建成环。
(2)运算符“%”的使用。
(3)循环的嵌套使用。
此题是著名的“约瑟夫环”问题。首先要将每个人的编号存入数组。因为每次是从s1开始报数,若是直线队则下一个开始报数的人的编号是s1+m-1,但这里要建立一个环,即最后一个人报完数后第一个人接着报数。所以这时下一个开始报数的人的编号足(s1+m-1)%i,i是此时圈中的总人数。若所得的结果为0,则说明要开始报数的是最后一个人。在此人前面的那个人就是要出圈的人,使用循环将要出圈的人移至数组的最后。开始时,总人数为n,以后依次减1,直到最后一个人出圈。
把正方形导线圈用细线挂在通电导线附近,使两者在同一平面内,其中直导线固定,线圈可以自由活动,如图所 物理 2020-05-17 …
抄题回答谢谢245.635(精确到0.1)175.65(精确到个位)12.004(精确到百分位)6 其他 2020-06-14 …
0到9.0,1,2,3-9各有多少个,10-99.0,1,2,3-9各有多少个.依次内推到1000 数学 2020-06-25 …
用24米长的篱笆围成一个长方形鸡圈若鸡圈的一条边靠墙明明设计了两种方案:用24米长的篱笆围成一个长 数学 2020-07-03 …
在△abc中,∠C=90°,∠a,∠b,∠c的对边为a,b,c.求(1)已知a=3.25,∠a=3 数学 2020-07-09 …
如图,线圈串有两发光二极管D1、D2(具有正向导电发光特性).若手握“物体”向线圈运动时,D1发光 物理 2020-07-09 …
(n+1)a(n+1)^2-n(an)^2+an[a(n+1)]=0十字相乘后为什么会得到[(n+ 数学 2020-07-31 …
f(x)=[(√x)+1]÷(x+3)中,如果令(√x)+1=tf(x)=[(√x)+1]÷(x+3 数学 2020-11-03 …
月亮的奇怪天际光圈今天凌晨3点的月亮有点不一样,为什么它周围万里无云有个巨大的光圈?而且很明显突出, 其他 2020-11-25 …
从北京到上海的动车,11:15发车,15:57到站.1.从北京到上海一共历时多长时间?从北京到上海的 数学 2021-01-19 …