约瑟夫环的解,有更好的方法吗?
假设有编号为 0——16 共17个人围成一个圆圈,编号为 0 的人从 1 开始报数,报数为 3 的人自动从圈子里退出,并输出几号退出了,当只剩 1 个人的时候,请输出他的编号。调试了两个小时写的代码,用最笨的方法,有比这个还简单的吗?
#include <stdio.h>
int main()
{
int a[17];
int num,b,c; //c计算次数,判断剩余人数;
for(b=0,c=0;b<17;b++,c++) //为数组a的每个元素赋值,代表人的编号
{
a[b]=c;
}
for(num=1,b=0,c=0;num<100;num++,b++)
{
if(b==17) //当下标超过界限,从 0 重来;
b=0;
while(a[b]==18) //如果数组内的值等于 18 ,判断下一个元素,直到不为 18 时结束。
{
b++;
if(b==17) //当下标超过界限,从 0 重来;
b=0;
}
if(num%3==0) //如果报的数能被 3 整除;
{
a[b]=18; //为数组内对应的元素赋值为 18;
printf("%d号离开了\n",b);
c++; //次数加 1 ;
}
if(c>=16) //如果次数大于等于16,剩余一个人时,停止;
break;
}
for(b=0;b<17;b++)
{
if(a[b]!=18)
{
printf("最后剩余的是 %d 号\n",a[b]);
}
}
return 0;
}