C++ 队尾幸运编号
题目描述:
N个人排成一队,从1到5轮流报数,报5的人是幸运者,出列。报到队尾后,从队首接着报。依次循环。
问:排到队尾的人是第几名幸运者?
例:
N=1,队尾是第1名幸运者。
N=2,队尾是第2名幸运者。
N=5,队尾是第1名幸运者。
N=8,队尾是第3名幸运者。
N=20,队尾是第4名幸运者。
输入:队伍总人数(N)
输出:队尾者的幸运编号
大体思路:
单项循环链表+循环判断:遍历链表,每5次判断结点值是否是队尾,删除结点。
代码如下:
#include<iostream>
using namespace std;
/*单项链表*/
class Node {
public:
int data;
Node* pNext;
};
class CreateList {
public:
CreateList(int n){
int result = 0, i;
Node* head = new Node; //创建表头
Node* ptemp = head;
head->data = 1; //表头数据为1
head->pNext = head;
//总人数如果大于等于2,创建后续链表
for (i = 2; i <= n; i++) {
Node* pnew = new Node;
pnew->data = i;
pnew->pNext = head;
ptemp->pNext = pnew;
ptemp = pnew;
}
//每五次判断结点是否为队尾,如果是队尾输出编号并退出,若不是删除结点编号加一继续判断
while (true) {
Node* pdelete;
for (int i = 0; i < 4; i++) {
ptemp = ptemp->pNext;
}
if (ptemp->pNext->data != n) {
pdelete = ptemp->pNext;
ptemp->pNext = pdelete->pNext;
delete pdelete;
result++;
}
else {
result++;
cout << result;
exit(EXIT_SUCCESS);
}
}
}
};
int main() {
int n;
cin >> n;
CreateList result(n);
return 0;
}
参考:
https://blog.csdn.net/gw_9527/article/details/100675521
https://blog.csdn.net/u011248694/article/details/25561857