您的位置:首页 > 编程语言 > C语言/C++

终于完成了Josephus的C语言实现啦~~

2015-08-21 11:00 513 查看
/*以下程序用来解决Josephus问题,现在只是完成了M>N的情况,2015-08-20 22:22:20*/
/*发现一个问题:数组的赋值问题:char People
={1};并不代表所有的元素都是1啊,要确保全都是1,务必使用char People
={1,1,1,1};或者采用循环给数组赋值*/
#include <stdio.h>
#include <math.h>
#define N 10 //
#define M 3 //
main(void)
{
char p,People
;//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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: