很多站长朋友们都不太清楚猴子选大王php,今天小编就来给大家整理猴子选大王php,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 猴子选大王的课程实验报告 2、 PHP算法之猴子选大王 3、 c语言链表问题,猴子选大王,哪位大神能帮我看看 4、 PHP猴子选大王 5、 猴子选大王 6、 猴子选大王算法(快 得急) 猴子选大王的课程实验报告任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能
#include <stdio.h>
#include <stdlib.h>
typedef struct monkey
{
int num;
struct monkey *next;
} Monkey,*LINK;
/*创建循环链表,容纳M个猴子。返回指向链表头结点的指针*/
LINK createList(int M)
{ LINK p,head1,p2;
int i;
head1=p=p2=(LINK)malloc(sizeof(Monkey));
for(i=1;i<M;i++)
{
p=(LINK)malloc(sizeof(Monkey));
p2->next=p;
p2=p;
}
p2->next=head1;
p=head1;
printf("对猴子进行编号!\n");
for(i=1;i<=M;i++)
{
p->num=i;
printf("%d号猴子:%d\n",p->num,p->num);
p=p->next;
}
return head1;
}
/*形成循环链表*/
/*从headP指向的循环链表中选大王,数到N的猴子淘汰,将依次淘汰出来的猴子插入到headPtr2指向的链表中*/
void selectKing(LINK head,int N,int M)/*N>=2*/
{
LINK p,p2,head2=NULL;
int i;
i=0;
p=head;//p指向第一个结点
while(1)
{
i++;
printf("%d号猴子报:%d\n",p->num,i);
if(p->next==p)
break;//此为while循环的出口
if(i==N)//if语句中是删除结点的过程
{
i=0;
printf("%d号猴被淘汰\n",p->num);
printf("\n");
p2->next=p->next;//在此删除结点p
p=p2->next;//p指向它的下一个结点
continue;
}
else
{
if(i==N-1)
p2=p;//保存将要退出结点的前一个结点(存到p2中)
p=p->next;
}
}
}
int main()
{
LINK head=NULL;
int M,N;
printf("输入猴子数量:");
scanf("%d",M); /*猴子个数*/
printf("输入选定的一个小于猴子总数的数:");
scanf("%d",N); /*count=3,表示每次数到3的猴子出局*/
head=createList(M);/*创建循环链表*/
selectKing(head,N,M);/*选大王*/
return 0;
}
PHP算法之猴子选大王一群猴子要选新猴王。新猴王的选择方法是:让M只候选猴子围成一圈,从某位置起顺序编号为1~M号。从第1号开始报数,每轮从1报到N,凡报到N的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
请输入猴子的数量m 11
请输入要排除第几个猴子n 3
7
常规做法又两种,一种是数组,一种是链表,(数学方法不考虑)。对于数组方法测试了两种思路,第一种是生成一个键为1-M的关联数组,值为true,退出的键值为false;另一种是值为1-M的数值数组,退出的unset;结果是使用unset效率更高些。链表是用数组模拟的链表,生成键为1-M的关联数组,值为下一位的键值,最后一位的值为1。退出了就把上一位和下一位链接起来。测试表明,使用链表的速度快于数组。
c语言链表问题,猴子选大王,哪位大神能帮我看看#include <stdio.h>
#include <stdlib.h>
typedef int status;
typedef int ElemType;
typedef struct NODE_MONKY
{
ElemType serial_number;
struct NODE_MONKY *next;
}LNode, *LinkList;
void Build(LinkList L,int n){
LinkList p,q;
p = L;
for(int i=0;i<n;i++)
{
printf("%d\n",i+1);
q = (LinkList)malloc(sizeof(LNode));
q -> serial_number = i+1;
q -> next = NULL;
p -> next = q;
p = q;
}
p -> next = L->next;
}
void Print(LinkList L,int x)//计算单链表的长度,然后输出单链表
{
LinkList p;
p=L->next;
while(x--)
{
printf("%d ",p->serial_number);
p=p->next;
}
}
void Delete(LinkList L,int x,int y)//删除值为x的结点
{
LinkList p,q;
p=L->next;
for (int i = 1; i < y; i++)
{
for(int j = 2; j < x ; j++)
{
p = p->next;
printf("serial_number change = %d\n",p->serial_number);
}
q = p->next;
p->next = q->next;
printf("delete %d success\n",q->serial_number);
printf("p->serial_number = %d\n",p->serial_number);
free(q);
q = NULL;
p = p->next;
printf("p->serial_number now = %d\n",p->serial_number);
}
}
int main()
{
int m,n;
LinkList L,p,q;
L = (LinkList)malloc(sizeof(LNode));
L -> next = NULL;
L -> serial_number = 1;
printf("please input the number of mounky.\n");
scanf("%d",n);
Build(L,n);
Print(L,n);
printf("Please input the number M\n");
scanf("%d",m);
Delete(L,m,n);
}
PHP猴子选大王$arr[] = $arr[$i]的意义在于 $arr[$i]是将确定键的值取出赋值给$arr[] 而$arr[]的键在没有特殊声明的赋值的时候是自动增长的,所以【不是覆盖】。
unset($arr[$i])是将数组$arr中键为$i的值释放掉。不是释放的整个$arr数组。
猴子选大王1.需求分析:
根据问题描述可知,该问题中m个猴子围坐在一起形成首尾相接的环,因此可用循环链表解决。从第n个猴子开始出列相当于从链表中删除一个结点。该程序主要有三个模块组成,建立单链表,报数利用do-while循环实现猴子的出列,最终剩下的猴子即猴王。具体步骤如下:
第一步 首先创建循环链表。
第二步 向单链表中填入猴子的编号
第二步 找第一个开始报数的猴子。
第三步 数到n让这个猴子出列。
第四步 接着开始报数,重复第三步
2.概要设计(流程图)
开始
定义结构体,变量
建立循环单链表
在循环链表填入数据
猴子数数Count++
Count= = n-1?
释放第n个猴子
指针q指向第n+1个节点q=q->next
否
q->next= =q?
是
猴王就是第q-〉data 个猴子
结束
3.详细设计:
#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 number m:");
scanf("%d",m);
printf(" input the number n:");
scanf("%d",n);
for(i=0; i< 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;
count=0;
printf("%d ", t->data);
free(t);
}
q=q->next;
}
while(q->next!=q);
printf(" the king is: %d ",q->data);
}
4.测试数据:
1)input the number m:20
input the number n:5
before:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14
the king is: 7
2)input the number m:9
input the number n:11
before:1 2 3 4 5 6 7 8 9
2 5 9 7 8 4 1 3
the king is: 6
3)input the number m:10
input the number n:5
before:1 2 3 4 5 6 7 8 9 10
5 10 6 2 9 8 1 4 7
the king is: 3
猴子选大王算法(快 得急)我用java写了一个,也是给人帮忙啦,可以给兄台参考参考,有空的话,给你改个指针版出来
MonkeyNumber.java源程序如下:
package test;
import java.util.Scanner;
/**
* @author Administrator
*
* 有M只猴子围成一圈,每只各一个从1到M中的编号,
* 打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,
* 数到N的猴子出圈,最后剩下来的就是大王。
* 要求:从键盘输入M、N,编程输出猴子出列的次序并计算哪一个编号的猴子成为大王(用数组实现)。
* 要求程序完整,并且验证过,
*
*/
public class MonkeyNumber {
/**
* 出圈
* <b>方法描述</b>:第outNo号出圈 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @param n
* @return outNo 出圈的索引号
*/
private static int getOut(int[] monkey,int n){
int outNo = -1;
int intValidVoters = getVotersNumber(monkey);
for(int i=0; i<monkey.length; i++){
if(intValidVoters > n){
if(monkey[i]==n%intValidVoters){
outNo = i+1;
monkey[i]=-1;// 去除该位置的值
System.out.print("--编号为["+outNo+"]的猴子出圈!--");
return outNo;
}
}
else if(intValidVoters < n){
if(monkey[i]==(n%intValidVoters==0?intValidVoters:n%intValidVoters)){
outNo = i+1;
monkey[i]=-1;// 去除该位置的值
System.out.print("--编号为["+outNo+"]的猴子出圈!--");
return outNo;
}
}
else if(intValidVoters==n){
if(monkey[i]==n){
outNo = i+1;
monkey[i]=-1;// 去除该位置的值
System.out.print("--编号为["+outNo+"]的猴子出圈!--");
return outNo;
}
}
}
return outNo;
}
/**
* 重新初始化数组
* <b>方法描述</b>:对输入的数组重新进行赋初值 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @param startPos 从startPos位置开始赋初值,startPos索引的数组,其值置为1
*/
private static void reAssign(int[] monkey, int startPos){
int count = 0;
//数组中大于等于位置startPos的有效值的个数
int behindCount = getVotersNumber(monkey, startPos);
//对号码重新初始化
for(int i=0;i<monkey.length; i++){
int differenceValue = i-startPos+1;
if(monkey[i] != -1){
if(differenceValue < 0){
monkey[i]= ++behindCount;
}
else if(differenceValue >= 0){
monkey[i]= ++count;
}
}
}
}
/**
* <b>方法描述</b>:取得当前有效选民数 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @return
*/
private static int getVotersNumber(int[] monkey){
int count = 0;
//计算目前多少个号码有效
for(int i=0;i<monkey.length; i++){
if(monkey[i] != -1){
count++;
}
}
System.out.print("当前有["+count+"]只猴子参加选举!");
return count;
}
/**
* <b>方法描述</b>:取得大于等于位置startPos的有效选民数 <p>
* <b>方法流程</b>:
* <p>
* @param monkey
* @return
*/
private static int getVotersNumber(int[] monkey,int startPos){
int count = 0;
//计算目前多少个号码有效
for(int i=startPos;i<monkey.length; i++){
if(monkey[i] != -1){
count++;
}
}
return count;
}
/**
* <b>方法描述</b>:主程序 <p>
* <b>方法流程</b>:测试
* <p>
* @param args
*/
public static void main(String[] args){
System.out.println("Input:M N ");
Scanner scanner = new Scanner(System.in);
String strM = scanner.next();
String strN = scanner.next();
while (strM == null || !strM.matches("[0-9]+")){
System.out.println("输入错误,您输入的第一个参数不是数字,请再次输入:");
scanner = new Scanner(System.in);
strM = scanner.next();
}
while (strN == null || !strN.matches("[0-9]+")){
System.out.println("输入错误,您输入的第二个参数不是数字,请再次输入:");
scanner = new Scanner(System.in);
strN = scanner.next();
}
int m = Integer.parseInt(strM);
int n = Integer.parseInt(strN);
System.out.println("当前有::["+m+"]只猴子"+",即将报的数是::["+n+"]");
int monkey[] = new int[m];
//赋初值
for(int i=0; i<m; i++){
monkey[i]=i+1;
}
for(int i=0; i<m-1; i++){
//出圈
int outNum = getOut(monkey,n);
int startPos = -1;
if(outNum==m){
startPos = 0;
}
else{
startPos = outNum;
}
//再次循环赋初值
reAssign(monkey,startPos);
System.out.println();
}
for(int i=0; i<m; i++){
if(monkey[i]!=-1){
System.out.println("Voting Success!!!编号为["+(i+1)+"]的猴子成为大王!");
}
}
}
}
关于猴子选大王php的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于猴子选大王php 猴子选大王java的详细内容...