当前位置:首页 > 游戏资讯 > 正文

帮帮忙,用free pascal做约瑟夫问题(猴子选大王),请用递归做_猴子选大王程序

本文目录一览

c++猴子选大王问题

是不是n个猴子报数选大王的题目?给20分,帮你写的明明白白,注释都可以一条条带上
基本思路:将猴子进行编号放入一个素组,然后外层以个while循环,控制猴子数量,循环条件为个数大于1.内层for循环遍历猴子,用一个变量来计算报数,假设报到3就退出的话··当计数等于3··就将数组元素赋为0;人数也减一个··最后循环输出数组元素··元素值不为0的就是大王

猴子选大王的问题帮我的c程序找找错

帮帮忙,用free pascal做约瑟夫问题(猴子选大王),请用递归做_猴子选大王程序-第1张-游戏资讯-龙启网络

因为你的count没变,进入了死循环

还有,遇到了0直接continue也算数了一个,这样不对的

而且用你的方法,到最后一次并不能判断现在指针指的不是0

我帮你将group改成了计数用的变量

帮你改的

#include"stdio.h"?

main()?

{?

?int?i,pe[30],*op=pe,*p=op,count=0,group=0;

?for(i=0;i30;i++)

?{

??op[i]=i+1;

?}

?while?(count??29)//去掉29个猴子

?{

??while?(group??7)//没到7个就一直做

??{

???while?(*p==0)//如果遇到0就一直往后找,直到不为0

???{

????if(p==(pe+29))

????{

?????p=pe;

????}

????else?p++;

???}

???group++;//找到了1个

???if?(group?==?7)//如果当次为最后一次,将当前的改为0

???{?

????*p=0;

???}

???if(p==(pe+29))//指针后移,用于下次操作

???{

????p=pe;

???}

???else?p++;

??}

??group?=?0;//重置计数器

??count++;//又去掉了一个猴子

?}

?

?for(i=0;i30;i++)?

??if(op[i])?

???printf("%d",op[i]);?

}

我觉得这个问题可以换种方法做?

我的做法?

#include?stdio.h?

main()?

{?

int?i,?j?=?0;?//修改J的值可以改变开始计数的猴子?

int?monkey[30],?count?=?0;?

for?(i=0;?i30;?i++)?

{?

monkey[i]?=?1;?

}?

for?(i=0;?i29;?i++)?//做29次,一次去掉一个猴子?

{?

while?(count??7)?

{?

if?(monkey[j])?

{?

count++;?

}?

if?(count?==?7)?

{?

monkey[j]?=?0;?

}?

j?=?(j?+?1)%30;?//下标移动,类似数据结构中的队列的下标?

}?

count?=?0;?

}?

for?(i=0;?i30;?i++)?

{?

printf("%d?--?%d\n",?i+1,?monkey[i]);?

}?

}?

找到是第23个,当然你可以自己指定开始计数的猴子的序号?

有问题可以用百度HI和我交谈

什么是约瑟夫问题

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。

java解决猴子选大王问题

import java.util.LinkedList;
import java.util.List;

public class Program {

/**
* @param args
*/
public static void main(String[] args) {
int N = 5;
ListMonkey monkeys = new LinkedListMonkey();
ListMonkey newMonkeys = new LinkedListMonkey();

//初始化猴子
for(int i = 0; i 17; i++){
monkeys.add(new Monkey(i));
}
newMonkeys.addAll(monkeys);
int index = 0;
while (true)
{
if (monkeys.get(index).numberOff() == N)//报数数到N
{
monkeys.remove(index);
Monkey.n = 1;
}
index++;
if (index = monkeys.size())
index = 0;
if (monkeys.size() == 1)//猴子只剩一个
break;
}

//查找当王的猴子原来的位置
for(int i = 0; i newMonkeys.size(); i++){
if(monkeys.get(0).getID() == newMonkeys.get(i).getID()){
System.out.println(i);
break;
}
}
}

}
class Monkey{
public static int n = 1;
private int id;
public Monkey(int id){
this.id = id;
}
public int getID(){
return id;
}

public int numberOff(){
int num = n;
n++;
return num;
}
}

猴子站在一圈选大王问题

if(j=1)? ?这个语句有问题?应该是if(j==1)? 但除了这个还有问题


要不要我帮你写过一个? 这是约瑟夫环问题

还是把你的改正

#includeiostream

using?namespace?std;

int?main()

{

?int?M,N,i;

?int?a[1000];

?cout"请输入猴子总数M:";

?cinM;

?cout"请输入间隔数N:";

?cinN;

?for(i=0;iM;i++)

? a[i]=i+1;?//对猴子进行编号1~M

?int?m=0,k=0;//m用来记下被淘汰的猴子数目? ?k用来循环报数

?i=0;//i要重置为0

?while(mM-1)

?{

?if(a[i]!=0)

?k++;

?if(k==N)

?{

?k=0;//重新报数

?m++;

?a[i]=0;

?}

?i++;

?if(i==M)

?i=0;

?}

for(i=0;iM;i++)

if(a[i]!='\0')

?cout"猴子大王的编号是:"a[i]"号"endl;

?return?0;

}

是这个意思吗?

帮帮忙,用free pascal做约瑟夫问题(猴子选大王),请用递归做

程序代码:
program
monkey;
type
link=^rec;
rec=record
num:integer;
next:link;
end;
var
p,q,head:link;
m,n,i:integer;
begin
write('The
total
number:');readln(m);//读入总数
write('The
elect
number:');readln(n);//读入每一次跳的数目
new(head);head^.num:=1;p:=head;//初始化
for
i:=2
to
m
do
begin
new(q);
q^.num:=i;
p^.next:=q;
p:=q;
end;
p^.next:=head;
p:=head;
i:=0;
repeat{循环
当p为p的子结点的时候停止
也就是说此时只有一个结点}
new(q);
q:=p;
p:=p^.next;
i:=i+1;
if
i=n
then
begin
i:=0;
p^.next:=q^.next;
dispose(q);
end;
until
p=p^.next;
writeln(p^.num);
readln;
end.

c语言问题:n人围成一圈,顺序报数.从1到5,凡报到5的退出圈子,问最后剩下是原来的第几号那位?

楼上的太麻烦,这个问题的经典例题是猴子选大王。
我的实现比较简单易懂,代码如下:

#include "stdio.h"

void main()
{
int i, j, k, m, n, num[100], *p;

printf("Input number: n = ");//输入数
scanf("%d", n);
printf("Input out number: j = ");//数到几被退出
scanf("%d", j);

p = num;
for (i = 0; in; i++)
*(p+i) = i+1;
i = 0;
k = 0;
m = 0;

while (m n-1)
{
if (*(p+i) != 0) k++;
if (k == j)
{
*(p+i) = 0;
k = 0;
m++;
}
i++;
if(i == n) i = 0;
}

while(*p == 0) p++;
printf("\nThe Last Number is: %d\n ", *p);
}