m个人依次编号为1~m,围成一圈,从第一个人开始报数,数到n的人出圈,后面的人继续从1开始报数,数到n的人继续出圈,直到所有人都出圈,求出圈人的编号次序。
用数组尝试求解,输入m=8,n=3.
#include<iostream>
using namespace std;
void main()
{int m,n,i,j,*p;
cout<<"Input m n:";
cin>>m>>n;
p=new int[m];
for(i=0;i<m;i++)
p[i]=(i+1)%m; //保证最后一个数组值为0,成环
i=m-1; //避免数组越界
while(p[i]!=i) //结点数>1
{for(j=1;j<n;j++) //推进n-1次
i=p[i];
cout<<p[i]+1<<" ";
p[i]=p[p[i]]; //数组飞跃实现删除
}
cout<<i+1<<" "<<endl; //最后剩下的人出圈
delete []p;
}
输出3 6 1 5 2 8 4 7