簡介
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>
#defineFALSE 0
#defineTRUE 1
typedefintDataType; /* 定義元素類型為整型,也可定義為其他類型 */
structNode; /* 單鍊表結點類型 */
typedefstruct Node*PNode; /* 結點指針類型 */
structNode /* 單鍊表結點結構 */
{
DataTypeinfo;
PNodelink;
};
struct LinkList/* 單鍊表類型定義 */
{
PNodehead;/* 指向單鍊表中的第一個結點 */
};
typedefstruct LinkList*PLinkList; /* 單鍊表類型的指針類型 */
intinsert_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 );
}
}
PLinkListcreateNullList_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;
}
PNodenext_clink( PNode p )
{
return p->link;
}
PNodefind_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 = %dnot 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);
}