約瑟夫問題-----方法一:順序表求解 C程式
據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺身亡為止。Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
#include<stdio.h>
#define N 41 //巨集定義人數
#define H 3 //巨集定義3
int main()
{
int man[N]={0}; //為方便計算 賦初值為零
int count=1; //計數器
int i=0,j;
int num=-1;
int alive;
while(count<=N) //判斷是否全部出列
{
num=(num+1)%N; //進行環式迴圈
if(man[num]==0) //判斷是否出列(0:未出列,非0:已出列)
i++;
if(i==H)
{
man[num]=count; //賦值為出列序號 如:三號 第一個出列--->man[2]=1
i=0;
count++; //統計出列人數
}
}
for(j=0;j<N;j++) //進行每行十個的輸出
{
if((j+1)%10==0) printf("\n");
printf(" %d--%d",j+1,man[j]);
}
printf("\n請輸入倖存人數\n"); //進行計算並輸出倖存者名單
scanf("%d",&alive);
printf("alive=%d\n",alive);
printf("num=%d\n",N-alive+1);
count=0;
i=0;
while(1)
{
num=N-alive+1;
if(man[i]>=num)
{
printf("第%d號倖存\n",i+1);
count++;
}
i++;
if(count==alive)break;
}
return 0;
}