首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

自己编了个约瑟夫有关问题,求有关问题出在哪

2012-03-23 
自己编了个约瑟夫问题,求问题出在哪!问题:n个人围成一圈,从第一个人开始依次从1到m循环报数,当报到m的时候

自己编了个约瑟夫问题,求问题出在哪!
问题:n个人围成一圈,从第一个人开始依次从1到m循环报数,当报到m的时候此人出圈,然后从下一个人开始重新报数,直到圈中只剩一人为止.打印出最后一个人的原始编号。
实现要求: 
采用数组模拟游戏过程
参加游戏人数最多50人:即数组上限为50。
可以输入参加游戏人数,以及报数上限
这是我的程序
#include<stdio.h>
main()
{
int a[50]={0},x,n,i,y,l;
printf("Please input 2 numbers:");
scanf("%d%d",&x,&n);
for(i=n-1,l=0,y=0;;y++)
{if(a[y]==1)
{
i++;l--;
}
if(i==0)
{
a[i]=1;
i=n;
}
i--;
l++;
if(l==x-1)break;
if(y=x-1)y=0;
}

for(i=0;;i++)
{
if(a[i]==0)
{
l=i;
break;
}
}

printf("The number is %d\n",l);

return 0;
}  

比如输入5,答案应该是3,不过这个程序是1

[解决办法]

C/C++ code
#include<stdio.h>main(){    int a[50]={0},x,n,i,y,l;    printf("Please input 2 numbers:");    scanf("%d%d",&x,&n);    for(i=n-1,l=0,y=0;;y++)    {        if(a[y]==1)        {                i++;//            l--;    这个不需要        }        if(i==0)        {            a[y]=1;        //    表达现在位置的应该是y而不是i            i=n;            if (++l==x-1)    //    在这里判断是否只剩下一个人了                break;        }        i--;//        l++;    这个也不需要,不是每次循环都有一个人被拉出去        //if(l==x-1)    这里移到上面去了        //    break;        if(y==x-1)    //    这里的比较算符少打了一个等号            y=-1;    //    这里你是想把y指到开始位置,但你忘了循环体结束后它会被增量。你得让他再小点才行。    }    for(i=0;;i++)    {        if(a[i]==0)        {            l=i;            break;        }    }    printf("The number is %d\n",l);    return 0;} 

热点排行