Description
有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。编程使用链表找出最后留下的人。
输入格式
输入一个数n,1000000>=n>0
输出格式
输出最后留下的人的编号
输入样例
3
输出样例
2
典型的链表问题
1.首先创建一个结构体
结构体中有变量:每一个人对应的编号以及指针
typedef struct node { int id; struct node *next; }node;
2.为第一个编号赋值,接着设置头指针,是头指针指向第一个编号所在地址。
p=new node; p->id=1; p->next=NULL; r=p;
3.接下来为所有人开辟空间并且赋值,并且让最后一个指针指回头指针。
for(i=2;i<=n;i++) { s=new node; s->id=i; r->next=s; r=r->next; } r->next=p;
4.接下来设置一个变量n,用来计算剩余人数,每一次id整除于3,使该编号为0,剩余人数减一。然后指向下一个地址。
while(n>1) { if(p->id!=0) { num++; if(num%3==0) { n-=1; p->id=0; } p=p->next; } else p=p->next; }
5.当n只剩下1时,跳出循环。
6.当p->id不等于0时,跳出循环,得到最后剩下的编码。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int id;
struct node *next;
}node;
int main()
{
int n,i;
scanf("%d",&n);
node *p,*s,*r;
p=new node;
p->id=1;
p->next=NULL;
r=p;
for(i=2;i<=n;i++)
{
s=new node;
s->id=i;
r->next=s;
r=r->next;
}
r->next=p;
int num=0;
while(n>1)
{
if(p->id!=0)
{
num++;
if(num%3==0)
{
n-=1;
p->id=0;
}
p=p->next;
}
else p=p->next;
}
while(!p->id)
p=p->next;
printf("%d",p->id);
return 0;
}