五、算法题(1题*10分,合计10分) 用C或C++或JAVA实现:设有m个人围坐一圈,并已1..m编号,按1到n的报数,报数到第n数的人出圈,再从他的下一个人重新开始1到n的报数,如此进行下去,计算最后一人的编号。
没有实际测试过
int man[M+1] = {1};//m个人的数组,man[i] = 1;说明编号为i的人在圈内,否则出圈。
int n = 1;//当前报的数
int m = 1;//当前的人的编号
int counter = 0;//出圈的人数
while(counter<M-1)//当只剩一个人的时候跳出
{
if(n == N && man[m]==1)//报数到N,并且这个人没出圈
{
man[m] = 0;//出圈
counter++;//出圈人数加一
n = 1;//重新开始报数
m++;//下一个人的编号
if(m>M)//如果绕完一圈则从编号为1重新开始
{
m = 1;
}
}
else if(n!=N && man[m]==1))//报数没到N,并且这个人没出圈
{
n++;//下个人报数
m++;
if(m>M)
{
m = 1;
}
}
else if(man[m]==0)//这个人出圈了
{
m++;//下个人再报数
if(m>M)
{
m = 1;
}
}
}
for(int i = 1; i < M; i++)
{
if(m[i] == 1)
{
cout<<i;//最后一个人的编号
}
}