数组实现
//约瑟夫环问题,数组实现,从1开始编号#include <iostream>using namespace std;int a[110] = {0};int main() { int n,m; int cnt = 0, i=0,k=0; //cnt表示目前出局的人数 cin >> n >> m; while(cnt != n) //当前出局的人数小于n { i++; if(i>n) i = 1; if(a[i] == 0) { k++; if(k == m) { a[i] = 1; k = 0; //方便下一个人重新从1开始报数 cnt ++ ; cout << i << " "; } } } return 0;}
循环链表实现

//约瑟夫环链表解法#include <iostream>using namespace std;typedef struct node{ int data; struct node *next;}Node;void ysflb(int n, int k) // 总共有n个人,报到数字为k的人出局。{ //创建循环链表 Node *head = NULL, *p = NULL, *r = NULL; head = (Node *)malloc(sizeof(Node)); //申请空间 if(head == NULL) //如果空间申请失败 { cout << "Memory Failed!"; return; } head -> data = 0; head -> next = NULL; p = head; //循环链表创建,使用尾插法 for(int i=1;i<n;i++) { r = (Node *)malloc(sizeof(Node)); r -> data = i; r -> next = NULL; p -> next = r; p = r; } p -> next = head; p = head; //约瑟夫环模拟 while(p -> next != p) { for(int i=1;i<k;i++) { r = p; //保存前一个节点 p = p -> next; //p为出局的节点 } cout << p->data << ' '; r -> next = p -> next; //删除p节点 p = p->next; } cout << endl << p->data;}int main() { //int n,k; //cin >> n >> k; ysflb(10,3); return 0;}
递归求解

#include <iostream>using namespace std;int ysf(int n,int k, int i)//设f(n,k,i)为n个人的环,报数为k,第i个人出环的编号,//则f(10,3,10)是我们想要的结果{ if(i == 1) return (n+k-1)%n; else return (ysf(n-1,k,i-1)+k)%n;}int main() { int n,m; cin >> n >> m; for(int i = 1; i<=n;i++) printf("第%d次出环:%d\n",i,ysf(n,m,i)); return 0;}