1. 程式人生 > >約瑟夫問題(順序表)

約瑟夫問題(順序表)

# include "stdlib.h"
# include "stdio.h"
# include "conio.h"
# define nmax 255
main()
{
int i,j,k,m,n,num[nmax],*p;
printf("約瑟夫問題——順序表/n輸入總人數n和退出編號m:/n"); // 輸入總人數,退出編號
scanf("%d%d",&n,&m);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1; // 人的位置編號從1開始到n
i=0; // i是掃描計數器,初值置為0,最大值為n,至n後再歸0
k=0; // k是m的計數器,至m後再歸0
j=0; // j表示被刪除的總人數
while(j<n-1) // 當退出的人數為n-1時,剩下最後一個所求的人,迴圈退出
{
if(*(p+i)!=0) // 從第一個值不為0的人開始迴圈
k++;
if(k==m)
{
*(p+i)=0; // 每次迴圈第m個人時,賦值為0,即標記其被刪除
k=0; //計數器歸0
j++; // 退出人數計數器加1
}
i++; // 掃描迴圈計數器加1,指向下一個人
if(i==n) //判斷一次掃描是否完成
i=0; // 若掃描完成,掃描迴圈計數器重新歸0,再次重頭掃描m倍數的人,並跳過那些已經被刪除(即被賦0的人)
}
while(*p==0) //跳過值為0的位置編號,使p指向值不為零即最後留在圈子中的人
p++;
printf("最後退出的是第%d位人/n",*p);
getch();
}