约瑟夫问题:总共有n个人排成一圈,从某个人开始,按顺时针方向依次编号。从编号为1的人开始顺时针报数1(下一个报号2),报到m的人退出圈子然后重新从1开始顺时针报数。这样不断循环下去,圈子里的人将不断减少。要求全部人员输出退出顺序。
#include<stdio.h>
#include<stdlib.h>
struct Node{
int num;
Node *next;
};
int main(){
int len, a=2;
Node *end, *r;
end = (Node*)malloc(sizeof(Node));
r = (Node*)malloc(sizeof(Node));
scanf("%d", &len);
//尾插法构建循环链表
end->num=1;
end->next=end;
for(int i=1; i<len; i++){
Node *s = (Node*)malloc(sizeof(Node));
s->num=a++;
s->next=end->next;
end->next=s;
end=s;
}
//开始报数杀人
int m, count=0;
scanf("%d", &m);
r = end;
while(1){
//数到 m 杀一人
if(count==m-1){
count=0;
printf("每次被杀的序号:%d\n", r->next->num);
r->next=r->next->next;
len--;
if(len==0){
break;
}
}
count++;
r = r->next;
}
return 0;
}
一直将自己的学习经验分享给有需要的人。
我是小郑,一个坚持不懈的小白