1. 程式人生 > >約瑟夫問題-----方法一:順序表求解 C程式

約瑟夫問題-----方法一:順序表求解 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;
}