作业帮 > 数学 > 作业

一道面试智力题,船上有N个人,船被海盗劫了,海盗给出一个数字K,让所有人站一排并逐个报数,报到K的被扔下海,然后下一位从

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:数学作业 时间:2024/08/10 05:22:39
一道面试智力题,
船上有N个人,船被海盗劫了,海盗给出一个数字K,让所有人站一排并逐个报数,报到K的被扔下海,然后下一位从1开始报数,报到K的再被扔下海,如此反复直到所有人都被扔下海.求被扔下海的人的序列.
例如:N=3,K=5 序列是231.
不能用数组或队列等数据结构,要用公式求解.
一道面试智力题,船上有N个人,船被海盗劫了,海盗给出一个数字K,让所有人站一排并逐个报数,报到K的被扔下海,然后下一位从
什么是约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止.问怎样排法,才能使每次投入大海的都是非教徒.
*问题分析与算法设计
约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多.题目中30个人围成一圈,因而启发我们用一个循环的链来表示.可以使用结构数组来构成一个循环链.结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该 人是否被扔下海的标记,为1表示还在船上.从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了.这样循环计数直到有15个人被扔下海为止.
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3.最后剩下1号.
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉.约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3.最后剩下1号.
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉.
通俗讲智取奖品问题:
许多人围成一个圈报数,报到一个特定的数的人退出,一支循环下去.
约瑟夫就是猴子选大王,猴子报数,最后选出大王.
求解约瑟夫问题递归算法(c语言版)
(1)建立具有几个结点的单循环链表,其数据域值为生成结点时的顺序号.
(2)用计数扫描过的结点,当j=m-1时,说明其直接后继结点就是出列结点,先输出其获数据域值,再删除该结点,再从被删结点的下一个结点重新开始计数.如此重复上述步骤,直到仅剩最后一个结点,再将该结点出列.
例如:
#include
typedef struct node {
int data;
struct node *next;}Lnode;
Lnode *create(int n){
int i;
Lnode *h,*p,*r=(Lnode*)malloc(sizeof(Lnode);
r->data=n;h=r;
for(i=n-1;i>0;i--){
p=(Lnode *)malloc(sizeof(Lnode));
p->data=i;
h=p;}
r->next=h;
return h;
}
void jeseph(Lnode *p,int m){
Lnode *q; int j=0;
printf("outqueue order:");
do{
j++;
if (j==m-1){
q=p->next;
p->next=q->next;
printf("%d",q->data);
j=0;free(q);}
while(p->next!=p);
printf(“%d\n",p->data);
free(p);
}
void main()
{Lnode *h ;
int m,n;
printf ("\n input n,m=");
scanf("%d,%d",&n,&m);
h=create(n);
jeseph(h,m);
}
一道面试智力题,船上有N个人,船被海盗劫了,海盗给出一个数字K,让所有人站一排并逐个报数,报到K的被扔下海,然后下一位从 智力题,有六百名群众被绑架,头目下令杀戳一部分人,于是让600名群众站成一排报数 每次报到奇数的人会被枪毙.有一个机智的 有N个人围成一个圈顺序编号,从第一个人开始报数(从1到M),凡报到M的人退出圈子, C语言指针 有n个人围城一圈,顺序排号.从第一个人开始报数(从1报到3),凡报到3的人 12个小朋友手拉手站成一个圆圈,从某一个小朋友开始报数,报到7的那个小朋友退到圈外,然后他的下一位重新报“1”.这样继续 2:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子, 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出(pascal 有一队士兵,共500名,站成一列,从左往右一到五报数,然后从右往左一到六报数,既报到五又报到六的士兵一共有几位? 有N只猴子选大王,选举的办法是:排成一排,从头到尾报数,报到3的倍数(3、6、9、……)的退出去,直到全部报完,然后从尾 C语言:有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 又n只猴子要选出一个大王,规定排成一排后按123报数,剔除报到3的,在从后向前123报数,剔除报到3的,按照这样的规则继 (Java 语言)有 n 个孩子站成一圈,从第一个孩子开始顺时针方向报数,报到 3 的人出列,下一个人继续从 1