C语言-猴子选大王

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("\n");
}
}
4.#include<stdio.h>
#include<stdlib.h>
#define MAXN 100 //最大个数
struct Node
{
int data;
struct Node *next;
};
void main()
{
struct Node *head, *s, *q, *t;
scanf("%d",&n);
}while((n<1)||(n>m));
a=(int *)malloc(sizeof(int));
if(a==NULL)
printf("程序无法继续运行......\n");
else
{
for(i=0;i<m;i++)
a[i]=i+1;
printf("原始顺序如下:\n");
}
}
}
//下一个猴子报数
position = (position + 1)%MonkeyNum;
}
//释放内存,开头为所有猴子创建的桌子
free(Monkeys);
return;
}
2.#include<stdio.h>
#include<stdlib.h>
#define MAXN 100 //最大个数
//而原来第i+1个至倒数第i个元素依次向前移动一个位置。
for(i=m;i>=2;i--)
{
s1=(s1+n-1)%i; //定位那个出圈的人的顺序号i
if(s1==0)
s1=i; //若s1=0表示本测出圈的队列中的最后一个人
w=a[s1-1]; //w为出圈的那个人的真实序号,因为1-n保存在p[i-1]中
}
{
int *Monkeys; //申请一个数组,表示所有的猴子;
int counter = 0; //计数,当计数为猴子个数时表示选到最后一个猴子了;
int position = 0; //位置,数组的下标,轮流遍历数组进行报数;
int token = 0; //令牌,将报数时数到M的猴子砍掉;
//申请猴子个数大小的数组,把桌子摆上。
for(i=m-1;i>=0;i--)
printf("%4d",a[i]);
printf("\n");
}
}
3.#include<stdio.h>
#include<stdlib.h>
#define MAXN 100 /*定义猴子总数*/
void main()Leabharlann Baidu
{
int i,j,*a,m,n,s1,w;
do//输入总个数
int n, m, count=0, i;
do//输入总个数
{
printf("请输入总个数(1-%d):",MAXN);
scanf("%d",&m);
}while((m<1)||(m>MAXN));
do//输入出圈时要数到的个数
{
printf("要数到的个数(1--%d):",m);
scanf("%d",&n);
q=q->next;
}
}
q->next=head;//形成圈
//以下代码输出原始状态
printf("原始状态:\n");
q=head;
while(q->next!=head)
{
printf("%4d",q->data);
q=q->next;
}
printf("%4d\n",q->data);
q=head;//以下代码实现出圈
//循环,直到选中大王
while(counter != MonkeyNum)
{
//如果这个位置的猴子之前没有砍掉,那么报数有效
if (Monkeys[position] == 0)
{
token++; //成功报数一个,令牌+1,继续报数直到等于M
//如果报数到M,那么将这个猴子砍去
if (token == CallNum)
1.#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void SelectKing(int MonkeyNum, int CallNum);
void main()
{
int MonkeyNum;
int CallNum;
/*输入猴子的个数*/
printf("Monkey Num = ");
{
printf("请输入总个数(1-%d):",MAXN);
scanf("%d",&m);
}while((m<1)||(m>MAXN));
do//输入出圈时要数到的个数
{
printf("要数到的个数(1--%d):",m);
scanf("%d",&n);
}while((n<1)||(n>m));
a=(int *)malloc(sizeof(int));
for(i=0;i<m;i++)
printf("%4d",a[i]);
printf("\n");
for(i=m-1;i>=0;i--)
{
for(k=1;k<=n;k++)
{
temp=a[0];
for(j=0;j<i;j++)
a[j]=a[j+1];
a[i]=temp;
}
}
printf("出圈的顺序如下,最后一个即为留下来的那一个:\n");
{
Monkeys[position] = 1; //设置为1,表示砍去
counter++; //计数增加
token = 0; //设置为0,下次重新报数
//如果是最后一个猴子,把它的位置打印,这个就是大王了
if (counter == MonkeyNum)
{
printf("The king is the %d monkey.\n", position+1);
Monkeys = (int *)malloc(sizeof(int)* MonkeyNum);
if (NULL == Monkeys)
{
printf("So many monkeys, system error.\n");
return;
}
//将数组的所有内容初始化为0,被砍掉的猴子设置为1
memset(Monkeys, 0, sizeof(int)*MonkeyNum);
void main()
{
int i,j,k,temp,*a,m,n;
do//输入总个数
{
printf("请输入总个数(1-%d):",MAXN);
scanf("%d",&m);
}while((m<1)||(m>MAXN));
do//输入出圈时要数到的个数
{
printf("要数到的个数(1--%d):",m);
}while((n<1)||(n>m));
for(i=0;i<m;i++)//创建循环单链表
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i==0)
{
head=s;
q=head;
}
else
{
q->next=s;
s1=1;
if(a==NULL)
printf("程序无法继续运行......\n");
else
{
for(i=0;i<m;i++)
a[i]=i+1;
printf("原始顺序如下:\n");
for(i=0;i<m;i++)
printf("%4d",a[i]);
printf("\n");
//进行(n-2+1)=(n-1)轮处理,每次把第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,
scanf("%d", &MonkeyNum);
/*输入M的值*/
printf("Call Num = ");
scanf("%d", &CallNum);
SelectKing(MonkeyNum, CallNum);
}
void SelectKing(int MonkeyNum, int CallNum)
for(j=s1;j<i;j++) //原来第i+1个至倒数第i个元素依次向前移动一个位置。
a[j-1]=a[j];
a[i-1]=w; //则将p[i]置于数组的倒数第i个位置上
}
printf("出圈的顺序如下,最后一个即为留下来的那一个:\n");
for(i=m-1;i>=0;i--)
printf("%4d",a[i]);
printf("出圈顺序:\n");
do
{
count++;
if(count==n-1)
{
t=q->next;
q->next=t->next;
count=0;
printf("%4d",t->data);
free(t);
}
q=q->next;
}while(q->next!=q);
printf("\n剩下的是%4d\n",q->data);
相关文档
最新文档