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
设计的单链表如图
// 8约瑟夫问题的实现.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class List {
public:
List();
List(int data);
~List();
void Create_List(int len);
void Play(int k);
void Output();
private:
int data;
List *Next;
};
List::List() {
}
List::List(int data) {
this->data = data;
this->Next = NULL;
}
void List::Create_List(int len) {
List *L, *Node;
int data;
int i = 0;
L = this;
L->data = len;
for (i = 0; i < len; i++) {
Node = new List(i+1);
L->Next = Node;
L = L->Next;
}
L->Next = this->Next;
}
void List::Play(int k) {
int i = 1;
List *Head = this;
List *L, *Node,*Temp;
L = Head;
Node = L;
while (Head->data!=1) {
L = Node;
Node = Node->Next;
if (i%k==0) {
if (Head->Next==Node) {
Head->Next = Node->Next;
}
Temp = Node->Next;
L->Next = Temp;
Node->Next = NULL;
delete Node;
Node = L;
Head->data--;
}
i++;
}
Head->Next->Next = NULL;
}
void List::Output() {
cout << this->Next->data;
}
List::~List() {
if (this->Next) {
delete this->Next;
}
}
int main()
{
List *Head=new List;
int len,c;
cin >> len;
Head->Create_List(len);
cin >> c;
Head->Play(c);
Head->Output();
delete Head;
return 0;
}