要求..
约瑟夫环问题的具体描述是:设有编号为1,2,......,n的 n(n>0)个人围成一个圈,从第一个人开始报数,报到m 时停止报数,报m 的人出圈,再从他的下一个人起重新报数,报到m 时停止报数,报m 的出圈,......,如此下去,知道只剩下一人为止。当任意给定n 和m 后,设计算法求n 个人出圈的次序。
#import <Foundation/Foundation.h>
struct node{
int data;
struct node * next;
};
struct node *head = NULL,*new,*end,*p;// new 为新建节点, end为尾节点,head 为头结点
int main(int argc, const char * argv[]) {
int n = 0;
int m = 0;
printf("请输入n的值:\n");
scanf("%d",&n);
printf("请输入m的值:\n");
scanf("%d",&m);
for(int i = 1; i < n+1; i++){
new = (struct node *)malloc(sizeof(struct node));
new->data=i;
new -> next = NULL;
if (i == 1) {
head = new;
end = new;
}else{
end->next = new;
end = new;
}
}
end->next=head;
//定义 p 为一直寻找m个数据后的指针,开始的时候,为头指针
p = head;
int num=1;//表示是否为第一次剔除人, 如果num为1 则第一次剔出人,如果等于2 则不是第一次剔出人
int x =1; //记录第几次 被剔除, 没有什么实际意义
while (n > 1) {
if(num == 1){
for (int i = 1; i< m-1; i++) {
p = p->next;
}
num= 2;
}else{
for (int i = 0; i< m-1; i++) {
p = p->next;
}
}
printf("%d %d\n",p->next->data,x);
p->next = p->next->next;
x++;
n--;
}
printf("最后输出的是:%d\n",p->next->data);
return 0;
}