約瑟夫問題:總共有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;
}
一直將自己的學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白