计算机等级考试三级编程解析十二

计算机等级考试三级编程解析十二,第1张

计算机等级考试三级编程解析十二,第2张

十二、圈子问题。

有N个人围坐成一个圈,从1到N顺时针编号,从s人数到m人,这个人离开圈,然后从下一个人开始数到m人,以此类推,直到所有人都离开圈。现在要求按照圈子顺序每10个人一组,给出这N个人的顺序表。要求考生编译函数Josegh()实现该函数,并调用函数WriteDat()将结果P输出到文件OUT。DAT
设n = 100,c = 1,m = 10。
(1)将1到n个人的序号存储在一维数组P中;
(2)如果第I个人计数后出圈,将p[i]放在数组倒数第一个位置,原I+1到倒数第一个元素依次前移一个位置;
(3)重复步骤(2),直到圆里只剩下p[1]为止。
给出了部分源程序。
不要更改主函数main()和输出数据函数writeDat()的内容。# include
# define n100
# define S1
# define M10

int p[100],n,s,m;
void write dat(void);

void Josegh(void)
{

}

void main()
{
M = M;
N = N;
S = S;
Jose GH();
write dat();
}

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);
}

/*注意:问题中第一个for()循环是先给数组p赋值初始值。在第二个for()中,I用于控制没有离开圈子的
人的总数。s1=(s1+m-1)%i的作用是找出报完号后离开圈子的人的下标,补I的作用是使圈子报出
的号(即报完号后,从头报起)。这种算法在很多课题中都有使用。因为余数的作用,当
数刚好在最后时,s1为0,所以需要判断是否(s1==0)。内嵌的for()循环是将脱离圈子的人
依次向前移动。*/
void Jose GH(void)
{
int I,j,s1,w;
S1 = s;
for(I = 1;IP[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;jp[j-1]= p[j];
p[I-1]= w;
}
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机等级考试三级编程解析十二

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情