(1)传说,著名犹大历史学家Josphus曾讲过一个故事:
在罗马人占领乔塔帕特后,40个犹太人与Josphus躲到一个洞中。40个犹大人决定宁愿死也不要被敌人逮到,于是决定了一个自杀方式:41个人排成一个圆圈,由第1个人开始报数,每报数到3,该人就必须自杀,然后再由下一个人重新报数,直到所有人都自杀身亡为止。
然而,Josphus并不想遵从自杀,于是他先假装同意该方案,然后坐到大家围成圆圈的第31个位置,逃过了这场死亡游戏。
a、一维数组
#include<bits/stdc++.h>
using namespace std;
const int N=10;//人数
const int M=3;//数到3出列
int a[N];
int main()
{
int pos=-1;//位置
int c=1;//出列序号
int i=0;
memset(a,0,sizeof(a));
while(c<=N){
do{
pos=(pos+1)%N;//保证在41以内
if(a[pos]==0) i++;//未被访问过
if(i==M){
i=0;
break;
}
}while(1);
a[pos]=c;
c++;
}
for(int i=0;i<N;i++)
printf("a[%d]-->%d\n",i+1,a[i]);
return 0;
}
b、 结构体
#include<bits/stdc++.h>
using namespace std;
struct node{
int bb;//初始序号
int cc;//出去的位置序号
char name[20];
}a[100];
int main()
{
printf("输入总人数n、循环数m: ");
int n,m;//n为总人数,m为循环数
cin>>n>>m;
printf("输入每个人的姓名:\n");
for(int i=0;i<n;i++){
a[i].bb=i+1;//每个人的初始序号
cin>>a[i].name;//每个人的名字
}
int pos=-1,i=0,c=0;
while(c<=