猴子选大王的问题帮我的c程序找找错

猴子选大王任务:一堆猴子都有编号,编号是1,2,3...30,这群猴子(30个)按照1-30的顺序围坐一圈,从第1开始数,每数到第7个,该猴子就要离开此圈,这样依次下来,... 猴子选大王
任务:一堆猴子都有编号,编号是1,2,3 ...30,这群猴子(30个)按照1-30的顺序围坐一圈,从第1开始数,每数到第7个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
#include"stdio.h"
main()
{
int i,pe[30],*op=pe,*p=op,count=0,k,group=7;
for(i=0;i<30;i++)
op[i]=i+1;
while(count<29)
{
for(k=0;k<group;k++)
{
if(p==(pe+29))
p=pe;
else p++;
if(*p==0)
continue;
}
*p=0;
}
for(i=0;i<30;i++)
if(op[i])
printf("%d",op[i]);
}
为什么运行后没有结果?
展开
 我来答
百度网友f7b9aa6bb
2009-02-09 · TA获得超过2250个赞
知道小有建树答主
回答量:584
采纳率:100%
帮助的人:463万
展开全部

因为你的count没变,进入了死循环

还有,遇到了0直接continue也算数了一个,这样不对的

而且用你的方法,到最后一次并不能判断现在指针指的不是0

我帮你将group改成了计数用的变量

帮你改的

#include"stdio.h" 

main() 

 int i,pe[30],*op=pe,*p=op,count=0,group=0;

 for(i=0;i<30;i++)

 {

  op[i]=i+1;

 }

 while (count < 29)//去掉29个猴子

 {

  while (group < 7)//没到7个就一直做

  {

   while (*p==0)//如果遇到0就一直往后找,直到不为0

   {

    if(p==(pe+29))

    {

     p=pe;

    }

    else p++;

   }

   group++;//找到了1个

   if (group == 7)//如果当次为最后一次,将当前的改为0

   { 

    *p=0;

   }

   if(p==(pe+29))//指针后移,用于下次操作

   {

    p=pe;

   }

   else p++;

  }

  group = 0;//重置计数器

  count++;//又去掉了一个猴子

 }

 

 for(i=0;i<30;i++) 

  if(op[i]) 

   printf("%d",op[i]); 

}

我觉得这个问题可以换种方法做 

我的做法 

#include <stdio.h> 

main() 

int i, j = 0; //修改J的值可以改变开始计数的猴子 

int monkey[30], count = 0; 

for (i=0; i<30; i++) 

monkey[i] = 1; 

for (i=0; i<29; i++) //做29次,一次去掉一个猴子 

while (count < 7) 

if (monkey[j]) 

count++; 

if (count == 7) 

monkey[j] = 0; 

j = (j + 1)%30; //下标移动,类似数据结构中的队列的下标 

count = 0; 

for (i=0; i<30; i++) 

printf("%d -- %d\n", i+1, monkey[i]); 

找到是第23个,当然你可以自己指定开始计数的猴子的序号 

有问题可以用百度HI和我交谈

甄喜欢你
2009-02-08 · TA获得超过182个赞
知道小有建树答主
回答量:216
采纳率:0%
帮助的人:205万
展开全部
约瑟夫环问题 你的算法有问题 跳不出循环
#include<stdlib.h>
#include<stdio.h>
typedef struct Monkey
{
int num;
struct Monkey *next;
}monkey;
void main()
{
monkey *head,*p,*pt;
int i,n;
puts(" enter n");
scanf("%d",&n);
head=p=(monkey*)malloc(sizeof(monkey));
for(i=1;i<n;i++)
{
pt=(monkey*)malloc(sizeof(monkey));
p->num=i;
p->next=pt;
p=pt;
}
p->num=n;
p->next=head;
p=head;
i=1;
while(p->next!=p)
{
if(i==7)
{
pt->next=p->next;
printf(" number %d exit\n",p->num);
p=pt->next;
i=1;
}
if(i==6)
pt=p;
i++;
p=p->next;
}
printf("winner is %d\n",p->num);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
空白空白君
2009-02-09 · TA获得超过418个赞
知道小有建树答主
回答量:480
采纳率:0%
帮助的人:0
展开全部
最好再在最后加句getchar();显示结果
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-02-08
展开全部
count值没有进行计数,导致while(count<29) 死循环
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式