Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
如果是其他数数规则,只要修改相应的A,B,C,D即可,A为第几个人需要出列,B为总共有多少个人,C为剩下多少人。D为是不是第一个先出,即0、1、2、3,是否先排除0,然后再隔着排除
#include <stdio.h>
#define A 3
#define B 41
#define C 2
#define D 0
//宏定义,A为排第几个出来,B为总人数,C为剩下的人数,D为当A为2时候先出还是后出补丁,按正常数数 修改为0即可
int main()
{
int a,i,b[B],c;
a = D;
c = 0;
//将数字排序
for(i=0;i<B;i++)
{
b[i] = i+1;
printf("%d\t",b[i]);
}
printf("\n");
//去除满足数到的数字
for(i=0;c!=(B-C);i++)
{
if(i==B)
{
i = 0;
}
if(b[i]!=0)
{a++;printf("\n i=%d,a=%d,",i,a);}
if(a==A && b[i]!=0)
{
printf("delect %d\t",b[i]);
b[i] = 0;
a = 0;
c ++;
printf("c=%d\n",c);
}
}
//打印最后面不为0的数字
for(i=0;i<B;i++)
{
if(b[i]!=0)
printf("\n 最后剩下来的是 %d",b[i]);
}
return 0;
}