约瑟夫环
#include <iostream> using namespace std; struct Node//定义单链表 { int val; Node* next; Node(int _val):val(_val),next(nullptr){} } ; class JoCycle{//定义环 private: Node* tail;//记录尾节点 public: JoCycle():tail(nullptr){} void Add(int num); void Eliminate(int step); void Print(); }; void JoCycle::Add(int num) { if(tail==nullptr)//环为空的情况 { Node* new_node=new Node(num); tail=new_node; tail->next=tail; } else { Node* new_node=new Node(num); new_node->next=tail->next;//新节点指向头节点,构成环 tail->next=new_node;//尾节点指向新节点 tail=new_node;//尾节点为新节点 } } void JoCycle::Eliminate(int step) { Node* p=tail; while(p!=nullptr && p->next!=p)//存在节点且不止一个节点 { for(int i=0;i<step-1;++i) { p=p->next; } Node* eliminate=p->next; p->next=eliminate->next;//删除节点 if(eliminate==tail)//正好删掉tail { tail=p; } cout<<"delete "<<eliminate->val<<endl; delete eliminate;//释放节点 Print(); } } void JoCycle::Print() { Node* cur=tail->next; while(cur!=tail) { cout<<cur->val<<" "; cur=cur->next; } cout<<tail->val<<endl; } int main(int argc, char *argv[]) { JoCycle jc; for(int i=1;i<6;++i) { jc.Add(i); } jc.Eliminate(3); cout<<"-----"<<endl; //数学归纳法 int m=3;//间隔 int ans(0); for(int i=1;i<6;++i) { ans=(ans+m)%i; } cout<<ans+1<<endl; return 0; }