約瑟夫問題是壹個著名的問題:n個人圍成壹個圈,從第壹個開始數,第m個會被殺死,剩下最後壹個,剩下的也會被殺死。比如N=6,M=5,被殺的人的編號是5,4,6,2,3。最後剩下1。假設圈裏前k個是好人,後k個是壞人。妳的任務是確定最小m,使所有的壞人都能在第壹個好人之前被殺死。
在節目中做壹些評論,供大家理解。
#定義nmax 50
int main()
{
int i,k,m,n,num[nmax],* p;
printf("舒易如舒歌:");
scanf("%d ",& ampn);
p = num
for(I = 0;我& ltn;i++)
*(p+I)= I+1;//生成初始值1,2,3...,n
I = 0;
k = 0;
m = 0;
while(m & lt;N-1)//當有N-1人出圈時,停止循環,即找到最後壹個出圈的人。
{
if(*(p+i)!= 0)k++;//開始計數。如果序列號(i+1)的人不退圈(也就是他的值不為0的時候),算。
If(k==3) //第三個人退出圈子,把他的數組元素清零。
{ *(p+I)= 0;
k = 0;//計數值清零,重新計算剩余第三人的位置。
m++;//算算有多少人出了圈。
}
i++;//數組元素偏移量向後移動壹位-& gt;*(p+i)
if(I = = n)I = 0;//如果數組元素的序號超過當前總人數,則從第1人開始循環。
}
而(* p = = 0)p++;//找出剩下的人的序列號,不是0的就是他!
printf("%d是左\n ",* p);//輸出結果。好的.
}