c语言编程(约瑟夫问题) 5

约瑟夫问题,n个人坐成一圈,从某个人开始报数,报到m后,该人出局,剩下的人继续报数,直到所有人出局为止,编程求出出局人的次序。(需要完整的程序。谢谢~)... 约瑟夫问题,n 个人坐成一圈,从某个人开始报数,报到m后,该人出局,剩下的人继续报数,直到所有人出局为止,编程求出出局人的次序。

(需要完整的程序。谢谢~)
展开
 我来答
wuhouzheng
2009-04-16 · TA获得超过8561个赞
知道小有建树答主
回答量:1010
采纳率:100%
帮助的人:1261万
展开全部
#include <stdio.h>
#include <stdlib.h>
/*n表示最初有多少个人,m表示报数到多少的人离开,函数Joseph返回最后剩下的人的编号*/
int Joseph(int n, int m)
{
int count = n; /*count表示当前圈内剩下的人数*/
int num=0; /*num表示当前报的数*/
int i,j; /*i表示当前报数的人对应的下标*/
int *a, remain;
/*动态申请连续的n个存储单元用来存放每个人的编号,将空间首地址赋值给a*/
a = (int *)malloc(sizeof(int));
for(i=0; i<n; i++) a[i] = i+1; /*a[i]保存第i个人的编号*/
i = 0; /*从下标为0的人开始报数*/
while(count>1) /*如果剩余人数大于1则循环*/
{
num++;
if(num == m) /*报数到m的人离开*/
{
/*将下标为i的元素删除*/
for(j=i+1; j<count; j++) a[j-1] = a[j];
count--; /*当前剩余人数减1*/
num = 1; /*下一个人重新从1开始报数*/
}
i = m%count; /*计算下一个要报数的人的下标*/
}
remain = a[0]; /*最后只剩下一个人,将其编号赋值给remain*/
return remain;
}
来源http://zhidao.baidu.com/question/57933683.html?si=2

30个人围成一个圆圈,从第一个开始依次报数,每数到第9个就将他扔入大海,如此循环直到仅余15个人,问怎样排法才能使每次投入大海的都是非教徒。
#include "stdio.h"
void main()
{
int i,k,quit_num,a[30],*p;
p=a;
for(i=0;i<30;i++)
*(p+i)=i+1;
printf("the position of feijiaotu are:\n");
quit_num=0;
k=0;
i=0;
while(quit_num<15)
{if(*(p+i)!=0)k++;
if(k==9)
{printf("%5d",*(p+i));
quit_num++;
*(p+i)=0;
k=0;
}
i++;
if(i==30)i=0;
}
printf("\nthe position of jiaotu are:\n");
for(i=0;i<30;i++)
if(*(p+i)!=0)printf("%5d",*(p+i));
}

来源http://zhidao.baidu.com/question/42805958.html?si=5
vbtraz
2009-04-16 · TA获得超过5530个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4400万
展开全部
输出的一排数字就是这一排人出局的顺序

#include <malloc.h>
void main()
{
int n, m;
printf("n m:");
scanf("%d %d", &n, &m);
int nout =0, current=0, number = 1;
int *theCircle = (int*)malloc(sizeof(int)*n);
for (int i=0; i<n; ++i) theCircle[i]=0;
while (nout <= n)
{
if (theCircle[current] == 0)
{
if (number == m) { theCircle[current] = nout; number =1; ++nout;}
else ++number;
}
++current;
if (current == n) current =0;
}
for (int i=0; i<n; ++i) printf("%d ", theCircle[i]);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
胥胜洛隽美
2020-03-27 · TA获得超过3884个赞
知道大有可为答主
回答量:3034
采纳率:25%
帮助的人:205万
展开全部
#include
"stdio.h"
main()
{
int
i,k,quit_num,a[30],*p;
p=a;
for(i=0;i<30;i++)
*(p+i)=i+1;
printf("the
position
of
feijiaotu
are:\n");
quit_num=0;
k=0;
i=0;
while(quit_num<15)
{if(*(p+i)!=0)k++;
if(k==9)
{printf("%5d",*(p+i));
quit_num++;
*(p+i)=0;
k=0;
}
i++;
if(i==30)i=0;
}
printf("\nthe
position
of
jiaotu
are:\n");
for(i=0;i<30;i++)
if(*(p+i)!=0)printf("%5d",*(p+i));
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
笑声搞笑阿黑
2019-05-02 · TA获得超过3594个赞
知道大有可为答主
回答量:3106
采纳率:30%
帮助的人:156万
展开全部
//约瑟夫环出列顺序
#include<stdio.h>
int
a[]
=
{0,
2,
3,
4,
5,
6,
7,
8,
1};
int
king(int
monkey[],
int
n,
int
key)
{
int
q,
p,
t;
q
=
n;
t
=
0;
do{
p
=
a[q];
t
=
t+1;
if
((t
%
key)
!=
0
)
q
=
p;
else
{
a[q]
=
a[p];
printf("%d
",p);
}
}
while(p
!=
a[q]);
return
p;
}
int
main(
)
{
int
m,n;
printf("几个猴子谁出列\n");
scanf("%d%d",&m,&n);
king(a,m,n);
printf("<--出列\nThe
king
is
%dth\n",
king(a,m,n));
return
0;
}
这是一个解决出列顺序和大王是谁的
不知对你有没有帮助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式