
猴子选大王的问题帮我的c程序找找错
任务:一堆猴子都有编号,编号是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]);
}
为什么运行后没有结果? 展开
因为你的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和我交谈
#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-08