全国计算机四级考试时间,2017年全国计算机四级考试出圈问题的链表解法(经典之作)

副标题:2017年全国计算机四级考试出圈问题的链表解法(经典之作)

时间:2023-09-14 14:03:03 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。


出圈问题是上级考试中最难的题之一,可以说如果能独立解决这个问题那么其他的题自然不在话下。

传统的解法使用了一种桥难理解的复杂算法,在这里我提供一种相对来说更易理解的算法“环链表模拟法”


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

本文来源:https://www.wddqw.com/vtTn.html