帮帮忙,用free pascal做约瑟夫问题(猴子选大王),请用递归做_猴子选大王程序
- 游戏资讯
- 发布时间:2025-01-16 14:50:21
本文目录一览
- 1、c++猴子选大王问题
- 2、猴子选大王的问题帮我的c程序找找错
- 3、什么是约瑟夫问题
- 4、java解决猴子选大王问题
- 5、猴子站在一圈选大王问题
- 6、帮帮忙,用free pascal做约瑟夫问题(猴子选大王),请用递归做
- 7、c语言问题:n人围成一圈,顺序报数.从1到5,凡报到5的退出圈子,问最后剩下是原来的第几号那位?
c++猴子选大王问题
是不是n个猴子报数选大王的题目?给20分,帮你写的明明白白,注释都可以一条条带上基本思路:将猴子进行编号放入一个素组,然后外层以个while循环,控制猴子数量,循环条件为个数大于1.内层for循环遍历猴子,用一个变量来计算报数,假设报到3就退出的话··当计数等于3··就将数组元素赋为0;人数也减一个··最后循环输出数组元素··元素值不为0的就是大王
猴子选大王的问题帮我的c程序找找错
因为你的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);
}