1169: 幸运儿
题目描述
编号从1到N的小朋友们围成了一圈。现在从1号小朋友开始报数,每个报出3的小朋友退出圈子,报3的后一位小朋友从1开始重新报数。那么,最后剩下的那一位会是谁呢?
输入
输入N的值。
输出
输出留在圈里的最后一位小朋友的编号。
样例输入 Copy
3
样例输出 Copy
2
接下来就是代码了:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Node {
int x;
struct Node* next;
}node;
int main()
{
int N;
cin >> N;
node* head = (node*)malloc(sizeof(node));//必须为指针开辟空间;
node* newNode=(node*)malloc(sizeof(node));
head->next = head;//链表头指向链表头 ,从而形成一个环形链表;
head->x = -1;
for (int i = N; i >= 1; i--) {//这个for循环是为了让每个孩子入链表
newNode = (node *)malloc(sizeof(node));
newNode->next = head->next;
newNode->x = i;
head->next = newNode;
}
while (newNode->next != head) {
newNode = newNode->next;//找到链表的表头
}
newNode->next = head->next;//让 newNode成为现在的链表头;
node* q;
for (int i = 0; i < N-1;i++) {//因为最后只留一个幸运儿,所以循环N-1此,从而踢出去N-1个人;
for (int i = 0; i < 3; i++) {//每过2个人就踢掉第三个人;
newNode = newNode->next;
}
q = newNode->next;
newNode->next = q->next;
free(q);
}
cout << newNode->x << endl;//最后链表中就剩余了一个幸运儿; 输出她就好了;
system("pause");
return 0;
}