猴子选大王c语言数组
来源:学生作业帮助网 编辑:作业帮 时间:2024/09/24 08:32:09 高中作文
篇一:猴子选大王-只用数组编写
/*猴子选大王*/
#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; 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 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;