输入参与游戏人数,依次报数,报到3退出游戏(可更改数字i),直至剩余1人
链表实现
#include<stdio.h>
#include<stdlib.h>
#define len sizeof(struct person)
struct person{
int num;
struct person *next;
};
int main(){
struct person *p1,*p2,*head;
int i,m;
printf("请出入参与人数:");
scanf("%d",&m);
head=(struct person*)malloc(len);
head->num=1;
p2=head;
for(i=2;i<=m;i++){
p1=(struct person*)malloc(len);
p1->num=i;
p2->next=p1;
p2=p1;
}
p2->next=head;
i=1;p1=head;
printf("退出顺序为:");
while(m>1){
if(i==3){
i=1;
m--;
p2->next=p1->next;
printf("%d ",p1->num);
free(p1);
p1=p2->next;
}
else{
p2=p1;p1=p1->next;
i++;
}
}
printf("\n剩下序号为: %d",p2->num);
}
数组实现
可以自己改成数组元素,不需要用指针p也可完成,比如,*(p+i)可直接用num[i]
#include<stdio.h>
int main()
{
int i,k,m,n,num[50],*p;
printf("请输入参与人数:");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1; //以1至n为序给每个人编号
i=0; //i为每次循环时计数变量
k=0;//k为按1,2,3报数时的计数变量
m=0;//m为退出人数
printf("退出顺序为:");
while(m<n-1) //当退出人数比n-1少时(即未退出人数大于1时)执行循环体
{
if(*(p+i)!=0)
k++;
if(k==3){
printf("%d ",*(p+i));
*(p+i)=0; //对退出的人的编号置为0
k=0;
m++;
}
i++;
if(i==n)//报数到尾后,i恢复为0
i=0;
}
while(*p==0)
p++;
printf("\n剩下序号为:%d", *p);
return 0;
}