|
正确的结果应该为7,14,21,28,24,16,8,2,11,20,30,19,9,4,17,29,15,1,18,26,6,13,23,5,25,12,3,10,27,
猴王为22
本人刚学编程不久,实在不知道我错在哪个地方,望高手邦一下,能够共同进步吧
/* 选猴王
有一群猴子(n个)选猴王,它们排成一行 ,来回从1至P报数,报P者出列,最后一个未出列的便是猴王*/
#include<iostream.h>
#define M 30
#define p 7
int main()
{
int i,a,c,r,s,x[M];//x[m]用来存放猴子的序号
for(i=0;i<M;i++)//对数组赋初值
x[i]=i+1;
i=0;a=0;c=1;r=M-1;s=0;//S为左边界,R为右边界
while(r!=s) //左边界和右边界相等,则只有最后一个元素了,退出循环
{
if(x[i]!=0)
{
a++; // a记录走的有效步数,就是如果x[i]==0这个地方已经没有猴子了,a就不加
if(a%p==0)
{
x[i]=0;//如果是P的倍数,则表示数到P,就将该位置赋值为0
cout<<i+1<<" ";
}
}
if(i==r) //如果数到了右端尽头,就把以c变成-1,i自减,以完成再从右向左数过来
{
c=-1;
while(x[r]==0)//如果右端边界为0了,则以此得到新的边界
r--;
i=r;
}
else if(i==s)//同上一个while ,s为左边界
{
c=1;
while(x[s]==0)
s++;
i=s;
}
else //不在边界上,则通过+C实现自增或自减
i=i+c;
}
cout<<endl;
cout<<"猴王为"<<r+1<<endl;
return 0; |
|