/*如下程序用來解決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