void Josegh(void) /*标准答案*/
{int I,j,k,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; “原题中采用的算法关键”
if (s1==0) s1=I;
w=p[s1-1];
for(j=s1;j<=I-1;j++) p[j-1]=p[j];
p[I-1]=w;}
}
注:题中第一个for()循环是先对数组p赋初值。在第二个for()中用i来控制没出圈的
总人数,s1=(s1+m-1)%i的作用是找出报数后出圈人的下标,其中对i求余的作用是使报
数按圈进行(即报到尾后又从头报),该算法在很多题目中都用到。由于求余的作用当
报数正好到最后一个时s1为0,故而要进行if(s1==0)的判断。内嵌的for()循环是将出圈
以后的人依次往前移。
环链表模拟法
void Josegh(void)
{ typedef struct p { int n;
struct p *next;} m; /*定义结构体*/
typedef m *link;
m *h,*s,*r; /*定义指针*/
int i,j,a[100]={0};
h=malloc(sizeof(m));
h->n=1;
r=h;
for(i=2;i<=100;i++) /*赋初值*/
{ r=(r->next=malloc(sizeof(m)));
r->n=i;
}
r->next=h;
r=r->next;
for(i=0;i<100;i++)
{ j=1;
while(j<9) /*模拟报数*/
{ r=r->next;
j++;}
a[i]=r->next->n;
h=r->next;
r=r->next=h->next;
free(h);
printf("%d\t",a[i]);}
}
2017年计算机四级考试出圈问题的链表解法(二).doc正在阅读:
仿写我爱这土地(精选11篇)05-10
我读懂了真谛作文600字12-28
小学三年级优秀作文:我的千变万化12-26
2019年云南怒江初中学生学业水平考试时间:6月28日至7月2日09-24
2021年7月四川日语二级成绩查询时间及入口【8月23日起】08-16
家乡美作文800字08-03