出圈问题的链表解法(二)(经典之作)

文章作者 100test 发表时间 2007:03:10 18:36:24
来源 100Test.Com百考试题网


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]).}

}

相关文章


06年9月计算机等级考试三级信息管理考前密卷答案(1)
出圈问题的链表解法(二)(经典之作)
三级(信息管理技术)样题
全国计算机等级三级信息管理技术笔试样题(含答案)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛