猴子问题
大家好!这几天我在忙着编一个问题,我用了一种方法编出来!
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
[bo] 题目[/bo]
[bo]山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。[/bo]
[bo]第一种方法:利用循环链表[/bo]
#include<stdio.h>
#include<malloc.h>
#define M 8 //共有8只猴子
#define N 3 //数到3只时退出第三只
typedef struct monkey
{int number;
int flag;
struct monkey* next;
}MONKEY;
main()
{ MONKEY *head=NULL,*p,*s;
int i,sum=0,count=0;
clrscr(); //清屏
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
p->number=1;p->flag=1;
p->next=head;
head=p;
for(i=2;i<=M;i++)
{ s=(MONKEY *)malloc(sizeof(MONKEY));
s->number=i;s->flag=1;
s->next=head;
p->next=s;p=p->next;
}
p=head;
for(;;)
{if(p->flag==1)
count++;
if(count==N)
{p->flag=0;
count=0;
sum++;}
if(sum==M-1)
break;
p=p->next;
}
p=
head;
for(i=1;i<=M;i++)
{ if(p->flag==1)
printf("\t%d",p->number);
p=p->next;
}
}
[bo]第二种方法:数组[/bo]
#include<stdio.h>
#define M 8
struct monkey
{int number;
int nextp;
}link[M+1];
void main()
{int i,count,h;
for(i=1;i<=M;i++)
{ if(i==M)
link[i].nextp=1;
else
link[i].nextp=i+1;
link[i].number=i;
}
printf("\n");
count=0;
h=M;
printf("依次退出的猴子: \n");
while(count<M-1)
{i=0;
while(i!=3)
{ h=link[h].nextp;
if(link[h].number)
i++;}
printf("%4d",link[h].number);
link[h].number=0;
count++;
}
printf("\n大王是:");
for(i=1;i<=M;i++)
if(link[i].number)
printf("%3d\n",link[i].number);
} [bo]
第三种是普通方法for循环[/bo]
#include<stdio.h>
void main()
{ int i,k,m,n,num[50],q,*p;
clrscr();
printf("input number of person: n=");
scanf("%d",&n);
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
scanf("%d",&q);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n-1)
{if(*(p+i)!=0) k++;
if(k==q)
{ *(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;
}
while(*p==0)p++;
printf("The last one is NO:%d\n",*p);
getch();
}
HOUZI1.rar
(8.88 KB)