- 现有n个人坐在一个桌前,从node开始数,数m个数,数到的那个人被杀死。接着跳过死掉的人往后数,直到只剩一个人为止。
代码如下:
#include <stdio.h>
//#include<malloc.h>
//#include <stdlib.h>
int main(){
//int *person,i,node,n,m;
//int count=0;//记死亡总数
int node,n,m;//n是总数,m是循环计数值
scanf("%d%d",&n,&m);
int person[n];
//person=(int*)malloc(sizeof(int)*(n+1));
for(int i=1;i<n;i++){//初始化圈
person[i]=i+1;//i表示编号为i的人,person[i]的值表示编号为i的人的下一个人的编号
}
//让数组循环起来
person[n]=1;//编号为n的下一个人的编号是1
node=1;
while(node!=person[node]){//如果某个人的下一个人不是自己,意味着人数超过1人
for(int i=1;i<m-1;i++){//这个循环终止于被杀的人的前一个人
node=person[node];//下一个人的编号为node,node的值来自于前一个人的person[node]
}
//count++;
printf("%d ",person[node]);//输出被杀的人编号
person[node]=person[person[node]];//下一个人替换掉被杀的人
node=person[node];//这句话中的node指向下一个开始计数的person
}
// int rest=n-count;
// printf("\n");
// printf("killed number:%d\n",count);
// printf("lived number:%d",rest);
printf("\n");
printf("%d",node);//输出最后幸存者的编号
return 0;
}