一个主循环就够了~
程序代码:
/*类约瑟夫环问题的数组解法*/
#include <stdio.h>
int main()
{ //声明部分
int N,x,y; //彩灯数量N,第一个灭灯的位置x,间隔y
int i,j,a[50],num;
scanf("%d%d%d",&N,&x,&y); //输入部分
for(i=0;i<N;i++)
a[i]=i; //把每盏灯的编号赋值
num=N; //初始化数据,用数组记录每盏灯的编号
printf("%d ",x); //处理第一个数据,即输出熄灭第一盏灯的位置
num--; //剩余灯数-1
a[x]=-1; //当被点灯时,记录编号的数据变为-1
for (i=x,j=0;num;i++) //i为点到灯的编号,j为记点次数,num剩余为灯数-每次执行循环点到灯的编号增加1
{ //当剩余灯数为0时结束循环
if (i==N) //当点到灯的编号大于人数(等于N)时,编号重置为0
i=0;
if (a[i]==-1) //当被点灯时,记录编号的数据变为-1,当再次被点时,跳过本次循环
continue;
j++; //经过continue筛选后,此时i已经点到下一位没有被筛选的灯的编号,记点次数加1
if (j==y) //当记点次数与间隔的值相等时
{
printf("%d ",a[i]); //输出此时对应的编号
a[i]=-1; //把编号标记为-1,表示此灯已被熄灭
num--; //剩余灯的数量减少1
j=0; //记点重置为0
}
}
printf("\n");
return 0;
}
[此贴子已经被作者于2016-11-29 01:00编辑过]