设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他顺时针方向上的下一个人起重新自1起顺序报数,报m的人出列,并将他的密码作为新的m值;如此下去,直到所有人全部出列为止。
设计一个程序模拟此过程,并给出出列人的编号序列。
#该怎么把每个人的顺序放到新数组里呢?
设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他顺时针方向上的下一个人起重新自1起顺序报数,报m的人出列,并将他的密码作为新的m值;如此下去,直到所有人全部出列为止。
设计一个程序模拟此过程,并给出出列人的编号序列。
#该怎么把每个人的顺序放到新数组里呢?
不需要建立新数组,出局的人只需要设定一个标志量就可以了。再定义一个变量记录当前还有多少人没出局。
struct man
{
int m;
bool k;
};
int main()
{
srand(time(NULL));
struct man s[100];
int n,i,m,now;
cin>>n>>m;
now = n;
for(i=0;i<n;i++)
{
s[i].m = rand()%5+1;
s[i].k = true;
}
i=0;
while(now > 0)
{
int count = 0;
while(1)
{
if(s[i].k)
{
count++;
if(count == m)
{
s[i].k = false;
m = s[i].m;
cout<<i+1<<" "<<m<<endl;
now--;
i++;
if(i>=n)
i=0;
break;
}
}
i++;
if(i>=n)
i=0;
}
}
}