很经典的编程问题!
约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,问最后一个人的序号
根据数据的存储方式分,我这边提供两种解题方法:一种是数组,一种是链表
1、数组的解法,用a[]来存储编号,用count来计数,数到m对应的那个a[i]设为-1来表示这个人被淘汰出局
#include<stdio.h>
void circle(int n,int m)
{
int a[n+1];
int i;
int count = 0;
int flag_num = 0;
for(i = 1; i <= n; i++)
{
a[i] = i;
}
for(i = 1, count = 0;;i++)
{
if(a[i] != -1)//未被删除
{
count++;
if(count == m)
{
a[i] = -1;//删除对应的i
count = 0;
flag_num++;//统计被删除的人数
printf("lost =