这是怎么了呀???

zjk2752 2008-02-28 10:59:04
[bo]正确的结果应该为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
本人刚学编程不久,实在不知道我错在哪个地方,望高手邦一下,能够共同进步吧[/bo]

/* 选猴王
有一群猴子(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;
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjk2752 2008-03-02
  • 打赏
  • 举报
回复
谢谢大家
Alix-Lei 2008-03-01
  • 打赏
  • 举报
回复
见过的一个最强的约瑟夫环解决方法
int main( void )
{
int n, i = 0, m, p;
printf("Entre the sum numbers and steps:\n");
scanf("%d%d", &n, &m); /*n只侯,报p*/
while( ++i <= n )
{
p = i * m;
while (p > n)
p = p - n + (p - n - 1)/(m - 1);
printf("%d ", p);
}
getch();
return 0;
}
wwl08210612 2008-03-01
  • 打赏
  • 举报
回复
程序很正规!
zjk2752 2008-02-29
  • 打赏
  • 举报
回复
非常感谢你,真的,太感谢了,我想了好久的,把我郁闷死了
0黄瓜0 2008-02-29
  • 打赏
  • 举报
回复

///////////////////////////////
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

0黄瓜0 2008-02-29
  • 打赏
  • 举报
回复

你给出的删除顺序前半是正确的,后半是错的.结果大王是13


/*
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;
}

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧