c语言 约瑟夫环问题

约瑟夫环
时间限制: 1 秒 内存限制: 10000 Kb
描述编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出圈为止。
输入说明仅有一组数据,输入数据第一行为两个正整数n(0<n<100)和m(0<m<99999999),分别表示人的个数及初始随机数,第二行为n个整数Ai(0<Ai<99999999,i=1..n),表示每个人持有的密码。
输出说明在一行输出n个整数表示依次出圈人的编号,整数之间用空格分隔
输入样例7 5
3 8 1 22 4 9 15

输出样例5 2 6 7 4 3 1

第1个回答  2012-12-20
输入输出不管了,不是很难
只给你中心算法吧
k=1;
x=n; //x记录没有出局的人数

i=0;

while(x>=0) //当x是零了,也就是没有人了,结束循环

{
if(i==n) //这样前后连接起来

i=0;
if(a[i]!=0) //这里数到不出局的,k加一次

k++;

if(k==m)
{
printf("%d,",a[i]); //出局打印
m=a[i]; //这个重新得到一个新的m值

a[i]=0; //标记出局了
x--; //标记少了一个人

}

i++

}本回答被提问者采纳
第2个回答  2012-12-20
百度百科对这个约瑟夫环的问题讲的比较透彻,推荐你研究一下。

参考资料:http://baike.baidu.com/view/717633.htm

约瑟夫环(单向循环链表)_C语言「抄作业」
在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Josephus与另一人最初位次的计算问题。作为一个计算机科学专业毕业多年后转行至产品经理的人,从当年的作业中搜集了这部分代码,供参考。

C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
通过循环链表,可以高效地模拟上述淘汰过程,实现约瑟夫环问题的解决。循环链表在约瑟夫环问题中的应用揭示了其强大的功能,以及在特定场景下的高效解决方案。通过结合循环链表的特性,可以构建出简洁、高效的代码实现。

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

c语言题目;有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3...
这个问题叫约瑟夫环问题。n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3...

求看下这个用C语言写的约瑟夫环代码错在哪儿
void del_Joseph(Joseph*current_p,Joseph *pre_p)这个函数去掉参数列表,直接用全局变量就行,不去掉反而会错。因为,当他们作为参数传递时,本身的值是不能被改变的。而你在函数中释放掉current_p所指向的空间,但current_p仍指向该空间,导致后面出错。发现这个问题,只要你打印下每次删除的值就行了...

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
next = NULL;} Node::Node(Node_entry item, Node *add_on){ entry = item;next = add_on;} --- include<iostream.h> \/\/文件2 typedef int Node_entry;struct Node { \/\/ data members Node_entry entry;Node *next;\/\/ constructors Node( );Node(Node_entry item, Node *add_on...

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 include <stdio.h>#include <stdlib.h>typedef struct _node { int id; int key; struct _node *next;} Linklist;int main() {int n, m;scanf("%d %d", &n, &m);int i, count = 0;Linklist *head = (Linklist*...

C语言,跳不出循环了。帮看看
约瑟夫环问题:处理方法关键是如何实现首位相连。一种思路是链表实现的首尾相连,另一种数组通过数字的调整实现,显然第一种更好。楼主实现的是第二种思路。对你的代码分析如下:首先你的分配序号有点抽象,可改为 for(i=1;i<=n;i++)num[i]=i;include <stdio.h> void main(){ int num[50];...

相似回答