约瑟夫环,看上去简单,实现起来有一定的难度,很早知道用循环链表实现,今天尝试用数组实现,的确是费了一番功夫;
总结如下,思考的多,代码编写起来容易,简单的多。几乎不思考,实现的笨办法考虑多种情况。今天实在数组循环计数栽了,每当数据计数变化的时候,一定要判断检查数组是否越界访问。
还有一种数学递归办法,相当于一个数学表达式,实在是Amazing, 不得不惊叹数学的伟大之处。
代码如下,
#include <iostream>
using namespace std;
int main()
{
int i,j,k;//i 数组循环变量,j报数数字,k记录归零的数目
int len;
int m;
cin>>len>>m;
int *list = new int[len];
for (i=0;i<len;i++)
list[i]=i+1;
for (k=0,j=1,i=0;k<len-1;)
{
if (list[i]==0)
{
i++;
if (i==len)
i=0;
continue;
}
if (j==m)
{
list[i]=0;
k++;
j=0;
}
i++;j++;
if (i==len)
i=0;
}
for ( i=0;i<len;i++)
{
if (list[i]!=0)
{
cout<<list[i]<<endl;
}
}
return 0;
}