标题：Josephus
简介
Josephus(约瑟夫斯): 约37--100 ,犹太历史学家和军人.原名约瑟夫.本.马赛厄斯.生于耶路撒冷.西元66年在反对罗马的犹太起义中他指挥一支加利利军队.在向罗马人投降时他施展手段获取优待,得以前往罗马,在那里写出几部关于犹太历史和宗教的著作,包括《犹太战争史》(History of the Jewish War,西元75--79年问世)和《犹太古事记》(Antiquities of the Jews,西元93年问世)卒于罗马。
生活于公元37年至100年的弗拉维乌斯o约瑟夫斯，虽然是以“犹太历史学家”留名于后世，但他一生的经历颇为复杂，且富有浓厚的戏剧性，似非“历史学家”一词可概括言之。
约瑟夫斯诞生于罗马人统治下的耶路撒冷的一位高级教士家庭，强烈的宗教气息和父辈的熏陶，使小约瑟夫斯成了早熟的神童。就一般人而言，十四年华，只是刚从儿童时代跨入少年的门槛，稚气犹未脱尽，意识尚属朦胧。但14岁的约瑟夫斯，竟能以自己丰富的学识和雄辩的口才与大祭司辩论深奥的犹太法问题，令人叹为观止。到了16岁，胸怀大志的约瑟夫斯已不满足闭门苦读，他费时三年外出旅行，在蛮荒之地留下了行行足迹，展读了自然和社会这本大书。此后，他曾加入过严格律己、笃信教义、仇视罗马统治者的法利赛派。
与罗马的战争
公元64年，担任公职的约瑟夫斯被派遣出使罗马，绚丽多彩的罗马文化，强大无比的帝国军队，都给约瑟夫斯留下了难以磨灭的印象。这次罗马之行，可以说改变了他的思想和信仰，甚至也改变了他的命运。
公元66年，爆发了著名的犹太人反对罗马的大起义，起义者将罗马的行政长官赶下台，并在耶路撒冷建立了自己的政府。约瑟夫斯被任命为加利利地区的军事长官。为迎击可能前来镇压的罗马军队，作为重要地区的军事指挥官，约瑟夫斯尽心尽职地作好了一切准备。
果真，次年2月，罗马皇帝尼禄任命韦斯巴芗为平定犹太起义的指挥官，率军逼进加利利。在长达47天的殊死搏斗后，终因寡不敌众，加利利陷于罗马人之手。
投降罗马人
约瑟夫斯在40名士兵卫护下撤到一个山洞里，士兵们虽然打得精疲力尽，但依然坚贞不屈，他们发誓，决不让罗马人生俘，欲以自杀明志。在此生死攸关的时刻，约瑟夫斯却贪生怕死，惊恐不已。身为指挥官，他不敢拂逆军心提出投降，遂灵机一动，想出一个花招。他诡称自杀之举有违于犹太教的道德规范，如果要杀身成仁，最好的办法是让每个士兵按抽签方法决定顺序，依次由别人动手。他的建议得到士兵的一致赞成。但在抽签时，他略施小技，使自己抽到最后一号。当士兵们按次序一个挨一个魂归西天，只剩下约瑟夫斯和最后一个士兵时，约瑟夫斯先发制人，结果了士兵的性命，自己则跑出山洞向罗马人投降。
罗马士丘捕获了加利利地区的军事长官，大喜过望，急忙把约瑟夫斯押到韦斯巴芗营帐里邀功。约瑟夫斯心知凶多吉少，情急生智，他对韦斯巴芗说：“我不但是加利利的军事长官，而且还是一名先知。我预言，你将成为罗马的皇帝”。韦斯巴芗听了，又喜又疑，决定暂不杀他，先囚于军营，看看他的预言是否灵验。约瑟夫斯的机关又一次救了他的命，他死里逃生，只得安下心来过他的囚徒生活。次年6月，罗马各军团拥立加尔巴为皇帝，尼禄被元老院裁决处死。而加尔巴当了不到八个月的皇帝，又于公元69年1月25日在罗马广场被禁卫军杀死。同年7月1日，两个埃及军团拥立韦斯巴芗为皇帝。约瑟夫斯的信口胡言竟成了事实，韦斯巴芗自然对他刮目相看，一时间，约瑟夫斯从阶下之囚跃升为席上嘉宾。
为了巩固后方，韦斯巴芗对犹太人发动了一次闪电战后，率军回到亚历山大里亚，在凯旋的大军中，约瑟夫斯追随在韦斯巴芗身旁。公元70年，罗马人围攻耶路撒冷，约瑟夫斯又跟随罗马军队参加了攻打耶路撒冷的战斗。同时，他还想以自己的特殊身份充当罗马人与犹太人的调解人。由于犹太人不屑于和背叛他们的约瑟夫斯打交道，罗马人也不信任他，约瑟夫斯终于没有扮演成调解人的角色。是年8月29日，耶路撒冷陷落，圣殿被毁，犹太国崩溃。约瑟夫斯回到罗马，在那儿定居下来，开始从事写作。他在政治、军事舞台上的帷幕落下来了。 
撰写《犹太战争史》和《上古犹太史》
作为一名历史学家，约瑟夫斯的第一部著作、七大卷的《犹太战争史》，于公元75年至79年五年间陆续问世。约瑟夫斯在书中对亲身经历的犹太人大起义作了详尽的叙述。但是，字里行间对犹太爱国者流露出极端仇视的情绪，而对犹太人在罗马统治下的悲惨境遇毫无同情之心。反之，一味渲染罗马军队的强大和威力，意在劝说犹太人不要与罗马为敌，甘心忍受其奴役。他的这种行径深得罗马统治者的赏识，赠于他罗马公民的资格和一笔年金。韦斯巴芗及后来的罗马皇帝提图斯、图密善，都把他视为宠臣，还让他担任了图密善宫中的史官。
公元93年，约瑟夫斯又完成了20卷的力作《上古犹太史》。是书对拿撤勒人耶稣的记载甚详。他在描绘耶稣时写道：“耶稣身高五英尺，身材瘦削，没有胡子；他富有感情，容易激动”。写得很形象、具体。耶稣生于公元前6年，约于公元30年被钉死在十字架上，由于没有与他同时代的资料留下来，而约瑟夫斯离耶稣活动的年代仅30年之隔，所以，他的这部著作对于研究耶稣其人及基督教史，具有很大的价值。
约瑟夫斯的文笔形象，生动。比如，他笔下的罗马人围攻约塔帕塔之役，场面壮观、惨烈。罗马人一个紧接一个高举铁盾在头顶上形成的大片“乌龟壳”，守卫在城上的士兵倾盆而泼的滚油和沸腾的沥青，读来令人恍若身临其境。但作为一个历史学家，论者以为，约瑟夫斯对历史所作的分析比较肤浅年代也常有错误，且有夸大、歪曲事实之嫌，其著作称不上真正的“良史”。
著名的Josephus问题
据说著名犹太历史学家 Josephus有过以下的故事：在罗马人占领乔塔帕特後，39 个犹太人与Josephus及他的朋友躲到一个洞中，39个犹太人决定宁愿死也不要被人抓到，于是决定了一个自杀方式，41个人排成一个圆圈，由第1个人开始报数，每报数到第3人该人就必须自杀，然后再由下一个重新报数，直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从，Josephus要他的朋友先假装遵从，他将朋友与自己安排在第16个与第31个位置，于是逃过了这场死亡游戏。
Josephus问题的C程序
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h> 
#define  FALSE   0
#define  TRUE    1
typedef  int  DataType; /* 定义元素类型为整型，也可定义为其他类型 */
struct  Node; /* 单链表结点类型 */
typedef  struct Node  *PNode; /* 结点指针类型 */
struct  Node   /* 单链表结点结构 */
{ 
DataType  info;
PNode  link;
};
struct LinkList  /* 单链表类型定义 */
{
PNode  head;  /* 指向单链表中的第一个结点 */
};
typedef  struct LinkList  *PLinkList; /* 单链表类型的指针类型 */
int  insert_clink( PLinkList pclist, DataType x, PNode p )
/* 在pclist所指的循环单链表中最后一个结点p的后面插入元素x */
{ 
PNode q;
q = (PNode)malloc( sizeof( struct Node ) );
if( q == NULL )
{
printf( "Out of space!!! \n" );
return ( FALSE );
}
else 
{
q->info = x;
q->link = pclist->head->link;
p->link = q;
return ( TRUE );
}
}
PLinkList  createNullList_clink( void )
/* 创建带头结点的空循环链表*/
{ 
PLinkList pclist;
PNode p;
pclist = (PLinkList)malloc( sizeof( struct LinkList ) );
if( pclist != NULL )
{  
p = (PNode)malloc(sizeof(struct Node));  /* 申请头结点 */
if (p!=NULL)
{  
pclist->head = p;
p->link = NULL;
}
else
pclist->head = NULL;
}
else
printf( "Out of space!!\n" );
return pclist;
}
PNode  next_clink( PNode p )
{
return p->link;
}
PNode  find_clink( PLinkList pclist, int i )
/* 在带有头结点的循环单链表clist中求第i(i>0)个结点的位置 */
/* 当表为空循环单链表时，返回值为NULL */
{ 
PNode p;
int j;
p = pclist->head->link;
if (i<1)
{ 
printf("The value of i=%d is not reasonable.\n",i);
return NULL;
}
if ( p == NULL )
return NULL;
for ( j=1;j<i;j++ )
p = p->link;
return p;
}
void josephus_clink( PLinkList pclist, int s,int m )
{ 
PNode p,pre,tp;
int i;
p = find_clink(pclist,s);  /* 找第s个结点 */
if (p==NULL)    /* 无第s个结点 */
{  
printf(" s = %d  not exit.\n ",s);
exit(1);
}
while (pclist->head->link!=NULL)
{ 
for (i=1;i<m;i++)  /* 找第m个结点 */
{ 
pre = p;
p = p->link;
}
printf(" out element: %i \n",p->info);  /* 输出该结点 */
if (pre!=p)  /* 当表中元素个数大于1时，删除该结点 */
{ 
pre->link = p->link;
tp = p;
p = p->link;
free(tp);
}
else    /* 当表中元素个数等于1时，将头结点指针置空 */
{ 
free(pre);
pclist->head->link = NULL;
}
}
free(pclist->head);
free(pclist);
}
main( )
{   
PLinkList jos_clist;
PNode p;
int i,n,s,m,k;
printf("\n please input the values of n = ");
scanf("%d",&n);
printf(" please input the values of s = ");
scanf("%d",&s);
printf(" please input the values of m = ");
scanf("%d",&m);
jos_clist = createNullList_clink( );  /* 创建空循环链表 */
if (jos_clist==NULL || jos_clist->head==NULL) return ( FALSE);
p = jos_clist->head ;
for( i = 1; i <= n; i++ )   /* 创建循环链表 */
{ 
k = insert_clink( jos_clist,i, p );
if (k==FALSE) return(FALSE);
p = next_clink( p );
}
josephus_clink(jos_clist,s,m);
return (TRUE);
}