所谓约瑟夫问题,是指n个人围坐在一张圆桌子周围,从某个人开始由1报数,数到m的人就出列,离开桌子,然后从下一个人开始重新从1报数,数到m的人又出列。如此下去,直到所有人都出列为止。
#include<stdio.h>
#include<stdlib.h>
void bfunc(int n,int m)
{
int a[100],i,j,k,num;
for(i=1;i<=n;i++) //设置一个数组,数组的大小为
{
a[i]=1; //数组初始化为1,即全部的人都坐在桌子旁
}
j = 0;
k = 0;
for(i=1;i<=n;i++) //开始一轮循环查找
{
if(a[i]==1) //只有在场的人才能进行被淘汰,即为1
{
j = j + a[i];
if(j == m)
{
printf("%d\n",i); //输出被选中的编号
j = 0; //同时将计数清零
a[i] = 0; //选中的人设置成0,即离开桌子
k++; //对离开的人的个数进行计数
}
if(k == n)
{
num = i; //当计数满时,跳出循环
break;
}
}
if(i==n) //一次循环下来将i清零,进行第二轮淘汰
i = 0;
}
}
int main()
{
int n,m;
printf("please input the total number:");
scanf("%d",&n);
printf("please input a digit:");
scanf("%d",&m);
bfunc(n,m);
system("pause");
return 0;
}