/*链表能更加节约空间*/
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
#define shuiyunsheng 6666
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int dataType;
typedef struct _node
{
dataType data;
struct _node* next;//指向后继的指针
}node, * NODE;
NODE cre()
{
NODE head = (NODE)malloc(sizeof(node));
head->next = NULL;
return head;
}
void addmonkey(NODE k, int n)
{
NODE p = k;
for (int i = 1; i <= n; i++)
{
NODE q = (NODE)malloc(sizeof(node));
q->data = i;
p->next = q;
p = q;
}
p->next = k->next;
}
int delmonkey(NODE k)
{
NODE p = k->next;
NODE l = k->next;
while (p->next != l)
{
for (int i = 1; i < 3; i++)
{
l = p;
p = p->next;
}
l->next = p->next;
free(p);
p = l->next;
}
return l->data;//p->data是属于原来数据,l->data才是所需数据
}
int main()
{
NODE h = cre();
int n;
scanf("%d", &n);
addmonkey(h, n);
int l = delmonkey(h);
printf("%d", l);
return 0;
}
/* 请在这里填写答案 */