作业帮 > 高中作文 > 教育资讯

猴子选大王c语言数组

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/24 08:32:09 高中作文
猴子选大王c语言数组高中作文

篇一:猴子选大王-只用数组编写

/*猴子选大王*/

#include

int choose(int n,int m);

int n,m; /*n只猴子,报数m*/

int a[51];

int main(void)

{

int i,j,p;

scanf("%d%d",&n,&m);

p=choose(n,m);

printf("%d",p);

getch();

return 0;

}

int choose(int n,int m)

{ int i,sum=0,countOne=n; /*存剩余猴子数*/ for(i=0;i

i=0;

while (i<=n)

{

if (i==n) i=0; /*当i=n时,循环回去*/ sum+=a[i];

if(sum==m) /*当报到m时 */

{

sum=a[i]=0; /*淘汰倒霉猴子;即赋0 */ countOne--; /*剩余猴子数-1*/

if (countOne==1) break; /*剩1只时结束*/ }

i++;

}

for(i=0;i

if(a[i]!=0)

return i+1; /*找到猴子大王编号(从1开始的)*/ }

/*LZL于 2012年11月15日,只用数组,不用指针*/

篇二:猴子选大王(C语言实现)

题目:猴子选王 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。

#include

struct monkey

{

int num;

monkey *next;

};

monkey *head,*tail;

void creat(int n)

{

int i;

monkey *p,*q;

p=new monkey; //为p分配内存空间

p->num=1; //初始化p结点num域为1

p->next=NULL; //初始化p结点next域为空

head=p; //链表头指针head赋值为p

q=p;

for(i=2;i<=n;i=i+1) //循环存入猴子

{

p=new monkey; //为p配内存空间

p->num=i; //初始化p结点num域为i,表示猴子号 q->next=p; //将p点加到链表尾部

q=p; //让指向链表尾部结点

p->next=NULL; //链表尾部指向空

}

tail=q; //链表尾

tail->next=head; //链表尾部指向链表头,形成循环链表 }

void select(int n)

{

int x=0;

monkey *p,*q;

q=tail; //q赋值给tail,指向循环链表尾部

do //直到型循环,用于循环删除指定间隔的结点 {

p=q->next; //p赋值给相邻的下一个结点

x=x+1; //x加1

if(x%n==0) //x是否整除m

{

printf("%d号猴子淘汰\n",p->num);

q->next=p->next; //删除此结点 delete p; //释放空间

p=NULL;

}

else q=p; //q指向相邻的下一个结点p }while(q!=q->next); //剩余结点数不为1,则继续循环 head=q; //head指向结点q,q为链表中剩余的一个结点

}

void main()

{

int n,m;

head=NULL; //初始化head为空

printf("请输入猴子的个数\n");

scanf("%d",&m);

printf("请输入n\n");

scanf("%d",&n);

creat(m); //调用函数creat建立循环链表

select(n); //调用函数select,找出剩下的猴子 printf("猴王是%d号\n",head->num); //输出猴王

delete head; //删除循环中最后一个结点

}

#include

int main()

{

int a[1000];//定义一个较大的数组存储数据

int m,n,x,count,i;//定义猴子数m、输入n、所需变量x、cout、i printf("请输入猴子个数:\n");//提示输入m

scanf("%d",&m);

printf("请输入n:\n");//提示输入n

scanf("%d",&n);

for(i=1;i<=m;i++) //令数组与猴子编号对应

a[i]=i;

count=m;//令cout等于猴子个数

x=0;//令x初始值为零

for(i=0;count>1;i++)// 执行循环,淘汰的猴子值为-1,直到只剩一只猴子,即为猴王

{

if(a[i%m+1]!=-1) {x++;}

if(x==n&&a[i%m+1]!=-1)

{a[i%m+1]=-1;count--;x=0;printf("%d号猴子淘汰\n",i%m+1);} }

for(i=1;i<=m;i++) //输出值不为-1的猴子,即猴王

if(a[i]!=-1) printf("猴王是%d号\n",i);

}

篇三:猴子选大王c语言程序

#include

#include

struct Node

{

int data;

猴子选大王c语言数组

struct Node *next;

};//建立一个节点结构体

int main()

{

struct Node *head, *s, *q, *t;

int n, m, count=0, i;

printf("input the monkey number m:");

scanf("%d",&m);

printf(" input the number n:");

scanf("%d",&n);

for(i=0; 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;

q=q->next;

}

}//建立一个不带头结点的单链表

q->next=head;//这里,将单链表组成环状,形成循环单链表

printf("before:");

q=head;

while(q->next!=head)

{

printf("%d ",q->data);

q=q->next;

}//依次输出节点的值

printf("%d ",q->data);

q=head;

printf(" ");

do {

count++;//计数器开始计数

if(count==n-1)

{

t=q->next;

q->next=t->next;//到n前面那个节点stop,然后删除第n个节点

count=0;//计数器复位

printf("%d ", t->data);//输出被淘汰的猴子的号码

free(t);//释放内存,防止内存泄露

}

q=q->next;

}

while(q->next!=q);//这句是关键,就是循环到只剩下一个节点了,如果说有难度的话应该是理解的难点了

printf(" the king is: %d ",q->data);//输出king的号码大王是输入猴子的数目 输入数字

}

篇四:C语言 猴子选大王

* 用数组做的,循环遍历数组,增加了一些注释,希望你能看懂。*/ #include

#include

#include

void SelectKing(int MonkeyNum, int CallNum);

void main()

{

int MonkeyNum;

int CallNum;

/* 输入猴子的个数 */

printf("Monkey Num = ");

scanf("%d", &MonkeyNum);

/* 输入M的值 */

printf("Call Num = ");

scanf("%d", &CallNum);

SelectKing(MonkeyNum, CallNum);

}

void SelectKing(int MonkeyNum, int CallNum)

{

int *Monkeys; // 申请一个数组,表示所有的猴子;

int counter = 0; //计数,当计数为猴子个数时表示选到最后一个猴子了; int position = 0; // 位置,数组的下标,轮流遍历数组进行报数; int token = 0; // 令牌,将报数时数到M的猴子砍掉;

// 申请猴子个数大小的数组,把桌子摆上。

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);

// 循环,直到选中大王

while(counter != MonkeyNum)

{

// 如果这个位置的猴子之前没有砍掉,那么报数有效

if (Monkeys[position] == 0)

{

token++; // 成功报数一个,令牌+1,继续报数直到等于M

// 如果报数到M,那么将这个猴子砍去

if (token == CallNum)

{

Monkeys[position] = 1; // 设置为1,表示砍去

counter++; // 计数增加

token = 0; // 设置为0,下次重新报数

// 如果是最后一个猴子,把它的位置打印,这个就是大王了 if (counter == MonkeyNum)

{

printf("The king is the %d monkey.\n", position+1); }

}

}

// 下一个猴子报数

position = (position + 1)%MonkeyNum;

}

// 释放内存,开头为所有猴子创建的桌子

free(Monkeys);

return;

}

篇五:猴子选大王C语言课程设计

数据结构课程设计报告

题 目:

院 (系): 专 业: 计算机科学与技术 班 级: 学 生: 指导教师:

2010年 12月

目 录

一、设计目的................................................................................................................... 1 二、设计内容................................................................................................................... 1 三、程序设计步骤............................................................................................................ 1 四、调试分析................................................................................................................... 5 五、测试结果................................................................................................................... 5 六、课程设计小结: ........................................................................................................ 6

一、设计目的

1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

2、提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。 4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。

二、设计内容

1、系统名称:猴子选大王

按照规定的要求,选出最后的一只猴子,为大王。

2、要求:

一堆有编号的猴子,编号为1,2,3……m,这群猴子(m个)按照1-m的顺序围坐一圈,从第一开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中剩下最后一只猴子,则该猴子为大王。

三、程序设计步骤

1)功能分析说明图:

2)采用主要的数据结构类型。

采用了链表的存储方式,属于链接存储结构。

for(i=1;i

p=(LINK)malloc(sizeof(Monkey)); p2->next=p; p2=p; }

以下是用于存储结点的结构体的定义:

typedef struct monkey {

int num;

struct monkey *next; } Monkey,*LINK;

基本算法:

这个算法的主要流程为:

从控制台读取猴子的数量和报数的最大数——>对猴子进行编号,并用链表来存储——>让链表中的猴子进行报数,对于报数为m的猴子则从链表中删除——>当链表中只剩下一个报数后则停止这个过程,这最后一个猴子即选出来的大王。

以下为为猴子建立链表:

for(i=1;i

p=(LINK)malloc(sizeof(Monkey)); p2->next=p; p2=p; }

以下为猴子进行编号:

for(i=1;i<=n;i++) //对猴子进行编号 {

p->num=i;

//printf("%d号猴子:%d\n",p->num,p->num);

p=p->next; }

以下为最主要的算法过程,是通过一个While循环来控制的,是让猴子报数的过程,并删除报数为m的猴子:

while(1) {

i++;

//当链表只剩最后一个元素了则跳出循环,此时报数已完成

printf("%d号猴子报:%d\n",p->num,i);if(p->next==p) break;

if(i==m) {

i=0;

printf("%d号猴被淘汰\n",p->num); printf("\n");

p2->next=p->next; p=p2->next; continue; } else {

if(i==m-1) p2=p; p=p->next; }

}

3)详细设计:

#include #include int n=2; int m=1;

typedef struct monkey {

int num;

struct monkey *next; } Monkey,*LINK; void main() {

printf("请输入一个整数(猴子数量):"); scanf("%d",&n);

printf("请输入一个小于猴子数量的整数(报数的最大数):"); scanf("%d",&m); LINK p,head,p2; int i;

高中作文