【C++】约瑟夫环(数组+链表)
基于数组:
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; int *a; int *vis; bool isfull(int m) { for(int i=0;i<m;i++) { if(!vis[i]) return false; } return true; } void john(int m,int n) { int p=m-1; while(!isfull(m)) { int left=n; while(left>0) { p=(p+1)%m; if(!vis[p]) { left--; } cout<<vis[p]; } vis[p]=1; cout<<":"<<a[p]<<endl; } } int main() { int m,n; while(scanf("%d %d",&m,&n)&&m&&n) { a=(int *)malloc(m*sizeof(int)); for(int i=0;i<m;i++) a[i]=i+1; vis=(int *)malloc(m*sizeof(int)); for(int i=0;i<m;i++) vis[i]=0; john(m,n); } return 0; }
基于链表:
#include<iostream> using namespace std; struct node { int data; node *next; }; node *head; void john(int m,int n) { node *p=head; node *r=head->next; while(r->next!=head) r=r->next; while(p) { if(p->next==p) { cout<<p->data<<endl; return ; } int left=n; while(left>1) { left--; p=p->next; r=r->next; } cout<<p->data<<endl; r->next=p->next; delete p; p=r->next; } } int main() { int m,n; while(scanf("%d %d",&m,&n)&&m&&n) { head=new node(); head->data=1; node *p=head; int a=2; while(a<=m) { node *t=new node(); t->data=a; p->next=t; p=p->next; a++; } p->next=head;//形成环 /* p=head->next; while(p!=head) { cout<<p->data<<endl; p=p->next; } */ john(m,n); } return 0; }
运行示例:
tz@HZAU
2019/3/12
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY