自己编了个约瑟夫问题,求问题出在哪!
问题: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
[解决办法]
#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;}