6.3w+
社区成员
///////////////////////////////
if(x[s]==0)
{
flag=1;
while(x[s]==0)
{
++s;
}
}
if(flag==1)
a++,flag=0;
i=s;
///////////////////////////////
//这段也可写为
if(x[s]==0)
{
flag=1;
while(x[s]==0)
{
++s;
}
}
if(flag==1)
flag=0,i=s-1;//因为在中间当把一个编号置0时,i的位置仍在编号为0的元素上
//但当x[s]==0 && i==s 时,while循环将i的位置移到了编号非0的元素上,所以要预先退一格
else
i=s
/*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
>>1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 19 20 22 23 24 25 26 27 29 30
<<1 3 4 5 6 9 10 11 12 13 15 17 18 19 20 22 23 25 26 27 29 30
>>1 3 4 5 6 9 10 12 13 15 17 18 19 22 23 25 26 27 29
<<1 3 4 5 6 10 12 13 15 17 18 22 23 25 26 27 29
>>1 3 5 6 10 12 13 15 18 22 23 25 26 27
<< 3 5 6 10 12 13 18 22 23 25 26 27
>>3 5 6 10 12 13 22 23 25 26 27
<<3 6 10 12 13 22 23 26 27
>>3 6 10 12 13 22 26 27
<< 13
*/
#include <iostream>
using namespace std;
#define M 30
#define p 7
int main()
{
int i,a,c,r,s,x[M];//x[m]用来存放猴子的序号
int flag=0;//新加的标志变量
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--;
if(x[r]==0)
{
flag=1;
while(x[r]==0)
r--;
}
if(flag==1)
a++,flag=0;
i=r;
}
else if(i==s)//同上一个while ,s为左边界
{
c=1;
//while(x[s]==0)
// s++;
if(x[s]==0)
{
flag=1;
while(x[s]==0)
{
++s;
}
}
if(flag==1)
a++,flag=0;
i=s;
}
//else //不在边界上,则通过+C实现自增或自减
i=i+c; //每个循环i都应变化,所以这句不能和if搅在一起
}
cout <<endl;
cout <<"猴王为" <<r+1 <<endl;
return 0;
}