约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人从1开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,知道圆桌周围的人全部出列。
分析:首先,标识这n个人,第一种标识方法是从0开始讲n个人标识为0~n-1;第二种方法是从1开始标识,将这n个人标识为1~n.
第一种情况下从0开始编号,编号为k的从环中移除之后,下一个要移除的是(k+m)%n(假设当前还有n个人在环中)。
第二种情况下从1开始编号,编号为k的从环中移除之后,下一个要移除的是(k+m-1)%n+1;
若从x编号开始怎要移除的编号的通式是(k+m-x)%n+x;
#include<iostream>
using namespace std;
//约瑟夫环利用数组实现
int main()
{
const int n=8;
int m=4;
int a[n];
for(int j=0;j<n;j++)
a[j]=j+1;
int k=1;
int i=-1;
while(1)
{
for(int j=0;j<m;)
{
i=(i+1)%n;
if(a[i]!=0)
j++;
}
if(k==n)
break;
cout<<a[i]<<",";
a[i]=0;
k++;
}
cout<<a[i]<<endl;
return 0;
}