题目链接:P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目大意:
N个人围一圈编号从1到N,每轮到M的倍数就输出,直到输完
思路:
链表
坑点:
有点麻烦,容易晕
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>//free函数的头文件
using namespace std;
int m,n;
struct Node{
int date;//数据域
Node*next;//指针域
}*head,*p,*tail,*temp; //头节点,指针变量,链表的结尾,存储要删的位置
int main()
{
cin>>m>>n;
head=new Node;//将上面定义的名为Node的结构体申请空间
head -> next = NULL;//因为循环是圆圈,所以首尾相连
tail = head;//同上一条
for(int i = 1; i <= m; i++)//就是链表里的删一个,将所删的上一个和下一个连在一起
{
p = new Node;
p -> data = i;
p -> next = NULL;
tail -> next = p;
tail = p;
}
p = head -> next;//圆圈更新
tail -> next = head -> next;// 链接尾和头
for(int i = 1; i <= m; i++)
{
for(int j = 1; j < n - 1; j++){
p = p -> next;//连接下一个节点
}
printf("%d ",p -> next -> data);
temp = p -> next;//要删的位置更新
p -> next = temp -> next;//连接要删除那个结点上下结点
p = p -> next;//轮流的位置更新
free(temp);//释放空间
}
return 0;
}
总结:
还是用其他方法吧,太绕了