约瑟夫问题的实现
2000(ms)
65535(kb)
2662 / 8037
n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)
输入
第一行为人数n; 第二行为报数k。
输出
输出最后胜利者的标号数。
样例输入
10 4
样例输出
5
#include<iostream> #include<stdlib.h> using namespace std; typedef struct node { int data; struct node *next; }Sqlist; int main() { int n,m; Sqlist *l,*r,*s; l=(Sqlist *)malloc(sizeof(Sqlist)); r=l; cin>>n; for(int i=1;i<=n;i++)//创建单循环列表 { s=(Sqlist *)malloc(sizeof(Sqlist)); s->data=i; r->next=s; r=s; } r->next=l->next;//让尾端的下一个指针指向头指针的下一个指针 cin>>m; s=l->next; while(s->next!=s) { for(int i=1;i<m-1;i++)//找出要删除的那个数 { s=s->next; } s->next=s->next->next;//跳过要删除的数 s=s->next;//让s指针指向下一个开始的数 } cout<<s->data; return 0; }