高手请进,一道c++问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 08:35:34
有n个人围成一圈,顺序排号。从第一个人开始报数(从一到三报数),凡报的三的人退出圈子,问最后留下的是原来第几号的那位?
可以重复,例如:1和2,就是121,1退出,最后剩下2.

你这个问题其实说的是Josephu算法,我用循环链表做了一个程序,你可以运行一下,其中最后输出的那个数就是你要的,我的n取的是10,希望对你有帮助
#include "iostream"
#define N 10

using std::cout;
using std::endl;

typedef struct node
{
int No;
struct node *next;
}node,*li;

li CreateRing(int n) //建立循环链表
{
li head = NULL,tail = NULL;
for(int i = 1;i<=n;i++)
{
if(i==1) head = tail = static_cast<li>(malloc(sizeof(node)));
else
{
tail->next = static_cast<li>(malloc(sizeof(node)));
tail = tail->next;
}
tail->No = i;
tail->next = NULL;
}
tail->next = head;
return(head);
}

li del(li s)
{
li p = s;
while(p->next!=s)
p = p->next;
p->next = s->next;
free(s);
return(p->next);
}
int main(void)
{
li head = NULL;
head = CreateRing(N);
for(int i = 0;i < N;