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
样例输出
这道题还是比较经典的问题,由于个人技术有限,所以就使用了模拟的方法,当然作为一个穷人,内存的空间能省就省,哈哈哈。话不多说,上代码。
附上代码
#include"iostream"
#include"cmath"
#include"cstring"
#include"stdlib.h"
using namespace std;
typedef struct node
{
int num;
node * next;
}Link;
//创造链表
void create(Link *&L,int n)
{
Link *p;
Link *r;
L = (Link *)malloc(sizeof(Link));
L->num = 1;
r = L;
for(int i = 2; i <= n; i++)
{
p = (Link *)malloc(sizeof(Link));
p->num = i;
r->next = p;
r = p;
}
r->next = L;
L = r;
}
int main()
{
int num;
int n;
Link *L;
Link *p;
cin >> num;
cin >> n;
create(L,num);
int con = 1;
//当L->next是它本身的时候,也就是只有它一个还存在的时候,循环结束。
for(; L->next != L;)
{
//因为删除节点是删除当前节点的下一个,所以这一层循环之循环n-1次数
for(int i = 1; i < n; i++)
L = L->next;
p = L->next;
L->next = p->next;
free(p);
}
cout << L->num;
return 0;
}