Josephus问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 20:30:35
一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。究竟胜利者是第几个小孩呢?程序要求输入小孩的个数以及数m的值,输出最后获胜的小孩的编号。(用数组实现)
要有详细的解析,急!

/*这个答案我不是已经给过了吗?
好象被删掉了,再给你发一次吧,补充一下,应作者要求,在这里解释一下代码的意思,我晕死.*/
#include <stdio.h>
#include <stdlib.h>
#define max 1024
void findout(int n,int m)//这函数的作用是找出最后剩下的小孩
{
int buf[max];//max上面有定义,为1024,大小你看实际需要改
int dex=0;
int in=0;
for(int i=1;i<=n;i++)//n是小孩的个数
{
buf[i]=i;//给小孩赋号码,第几个小孩,号码就为几
}
while(n>in+1)//剩下小孩个数大于1的时候才执行
{
for(i=1;i<=n;i++)//遍历所以小孩
{
if(buf[i]!=0)//小孩号码不为0的时候
{
dex++;
if(dex==m)//若是数到m,
{
buf[i]=0;//则把小孩号码改成0
in++;//被排除的小孩个数加1
dex=0;//判断值清0,从新开始找
}
}
}
}//while.退出的时候只剩下一个小孩
for(i=1;i<=n;i++)
if(buf[i]!=0)
printf("最后的小孩号码为:%d\n",buf[i]);//打印小孩的号码

}
void main()//这个函数够简单吧,这个自己看,我累死了
{
int n,m;
char c='y';
printf("#############测试开始了#############\n");
printf("\n")