/*以下程序用来解决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 ",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 ",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;