一、 递归实现约瑟夫环
第一次写,还不太熟练,见谅见谅。
int ran(int n, int m) {
if (n == 1) {
return 0; //这里返回下标,从0开始,只有一个元素就是剩余的元素0
}
else {
return (ran(n - 1, m) + m) % n; //我们传入的n是总共多少个数
}
}
int main() {
int a, b;
cin >> a >> b;
cout << ran(a, b) << endl;
return 0;
}
二、循环实现约瑟夫环
int main() {
int a, b;
cin >> a >> b;
int result = 0;
for (int i = 2; i <= a; i++) {
result = (result + b) % i;
}
cout << "result = " << result << endl;
return 0;
}
三、循环链表实现约瑟夫环
struct node
{
int data;
node *next;
};
int main()
{
int x[1001] = { 0 };
int n, m,count=0;
node *head = NULL,*s;
head = (node*)new node[1];
node *p = head;
cin >> n >> m; //输入总数n和报数m
for(int i=0;i<n;i++) //建立链表
{
cin >> x[i];
count++;
s = (node*)new node[1];
s->data = x[i];
s->next = p->next;
p->next = s;
p = s;
}
p->next = head->next;
int k = 0;
p = head;
while (count>1) //当链表只剩下最后一个元素时结束循环
{
s = p;
p = p->next;
k++;
if (k == m) //杀死报数为m的人
{
s->next = p->next;
delete p;
p = s->next;
k = 1;
count--;
}
}
cout << p->data << endl;
return 0;
}