约瑟夫环问题,可以用数组和链表实现,网络上算法很多。这里介绍一种用数组的实现的方法。
思路:50个人分别以1-50编号,从第一位开始1到3报数,报到3的人,把编号设置为0,直到完成一轮循环。
然后进行第二论循环,这次编号为0的人,不参加报数。直到有49个人编号设置为0。
#include<iostream>
using namespace std;
int main()
{int a[50]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49.50};
int i,j,k=0;
for(i=0;i<48;) //当设置编号为0的人达到49人,退出循环
{for(j=0;j<50;j++)
{if(a[j]!=0)//判断人员编号是否为0
{k++;
if(k%3==0)//是否为3的倍数
{
a[j]=0;//设置人员编号为0;
i++;//人员不参与报数的加1
}
}
}
}
for(j=0;j<50;j++)
if(a[j]!=0)cout<<a[j]<<endl;//输出非0数据
return 0;
}
结果:编号第8个人