小白人士,如有高见,欢迎分享。
/*13个人围成圈,从第一个人开始顺序报号1,2,3,凡是3者退出圈子,求最后圈中人原来的序号 利用结构体实现*/
#include<stdio.h>
#define PERSON 13//参与人数
#define SIGN 3 //退出暗号
struct person{
int no;//原始序号
int num;//报号
int survival;//存活元素
}p[PERSON],*p_p = p;
//函数原型
void person_no();
void person_out();
void main(){
person_no();
person_out();
//打印测试
for(;p_p < p + PERSON;p_p++){
if(p_p->survival == 1)
printf("no = %d | num = %d | survival = %d\n",p_p->no,p_p->num,p_p->survival);
}
}
//分配原始序号
void person_no(){
int temp = 1;
for(int i = 0;i < PERSON;i++){
(p_p+i)->no = temp++;
(p_p+i)->survival = 1;
}
}
void person_out(){
//临时变量用于给元素顺序赋值 1 2 3
int temp = 1;
//统计淘汰的人数
int p_out = 0;
//当淘汰到最后一位时退出循环
while(PERSON - p_out > 1){
for(int i = 0; i < PERSON;i++){
//判断当前元素是否存活
if((p_p+i)-> survival == 1){
//按1 2 3顺序赋值给存活的元素
(p_p+i)-> num = temp++;
//判断元素是否等于3
if((p_p+i)-> num == SIGN){
//元素值为3时淘汰元素
(p_p+i)-> survival = 0;
//统计淘汰数量
p_out++;}
//重置变量
if(temp > SIGN)temp=1;
}
}
}
}