終於完成了Josephus的C語言實現啦~~

/*如下程序用來解決Josephus問題,如今只是完成了M>N的狀況,2015-08-20 22:22:20*/
/*發現一個問題:數組的賦值問題:char People[N]={1};並不表明全部的元素都是1啊,要確保全都是1,務必使用char People[N]={1,1,1,1};或者採用循環給數組賦值*/數組

#include <stdio.h>
#include <math.h>
#define N 10 //
#define M 3 //
main(void)
{
char p,People[N];//1 means alive 0 means died
for(p=0;p<N;p++)
{
People[p]=1;
}
int Last=N,j=0,k=0,Temp=0;
if(M>N)
{
while(Last!=0)
{
j=(M%Last)-1;//須要從當前的值移動的總次數(要排除掉已經爲0的元素)
if(j>0)
{
for(k=1;k<=j;)
{
Temp++; //當前的值自加獲得下一次的數組元素值
if(Temp>N-1) {Temp=0;}
if(People[Temp]!=0) {k++;} //若是下一個元素的值爲0 ,那麼k就不會變化
} 
}
else 
{
for(k=1;k<=abs(j);)
{
Temp--; //當前的值自減獲得下一次的數組元素值
if(Temp<0) {Temp=N-1;}
if(People[Temp]!=0) {k++;} //若是下一個元素的值爲0 ,那麼k就不會變化
} 
}
printf("People rank %d is died\n",Temp+1);
k=Temp+1;
for(k;People[k]==0;k++)//要肯定下一個其實元素的值,下一個元素的值不能是0,而是第一個1
{
if(k>N-1) {k=0;} //假若k大於N-1時,就須要將k賦值爲0避免溢出
}
Temp=k;
Last--;
}
}
else 
{
while(Last!=0)//N4 M2
{
for(k=1;k<=M-1;)
{
Temp++; //當前的值自加獲得下一次的數組元素值
if(Temp>N-1) {Temp=0;}
if(People[Temp]!=0) {k++;} //若是下一個元素的值爲0 ,那麼k就不會變化
} 
People[Temp]=0;
printf("People rank %d is died\n",Temp+1);
k=Temp+1; if(k>=N) {k-=N;}
for(k;People[k]==0;k++)
{
if(k>N-1) {k=0;}
}
Temp=k;
k=1;
Last--;
}
}
return 0;
}

注:若要改變起始位置,好比從第K我的開始,則Temp=K-1;spa

相關文章
相關標籤/搜索