- 浏览: 75078 次
- 性别:
- 来自: 北京
/************************************************************************* * 约瑟夫环问题 *n个人围成一圈,用1-n编号,从1号开始报数,报到m的人出局,下一个人从1继续 *报数,求最后出列的人的编号。 * * 解法 *(1)稍微将问题转化一下,让编号从0开始,到n-1; *(2)假设第一次报数后,s出局,则s=m%n-1,下次从k=m%n开始报数; *(3)此时重新编号,k->0,k+1->1,k+2->2,... *(4)恰好我们在这个时候知道了问题的答案,这个人在第二次编号中为q, * 在第一次编号中为p,则有p=(q+k)%n=(q+m%n)%n=(q+m)%n, *(5)则得到此问题的通项公式 * f(1)=0; * f(n)=(f(n-1)+m)%n n>1; *(6)若从1开始编号,假设m%n==0,则第一次出局的人的编号是0(实际是n), 这样就要再做进一步处理。如果从0开始编号,就会避免这个问题。 * 最后的结果转换只相差1. ************************************************************************/ #include <stdio.h> /** * josephus - * @n: total persons * @m: count to * @k: start with the person k */ int josephus(int n, int m, int k) { int i; int s=0; for(i=2;i<=n;i++) s=(s+m)%i; return (s+k-1)%n+1; } int main(int argc, char *argv[]) { int m, i; m = 3; /*start with person 1 */ for(i=1;i<=20;i++) printf("\tThe result is :%d when n=%d m=%d k=1\n",josephus(i,m,1),i,m); return 0; }
结果
The result is :1 when n=1 m=3 k=1 The result is :2 when n=2 m=3 k=1 The result is :2 when n=3 m=3 k=1 The result is :1 when n=4 m=3 k=1 The result is :4 when n=5 m=3 k=1 The result is :1 when n=6 m=3 k=1 The result is :4 when n=7 m=3 k=1 The result is :7 when n=8 m=3 k=1 The result is :1 when n=9 m=3 k=1 The result is :4 when n=10 m=3 k=1 The result is :7 when n=11 m=3 k=1 The result is :10 when n=12 m=3 k=1 The result is :13 when n=13 m=3 k=1 The result is :2 when n=14 m=3 k=1 The result is :5 when n=15 m=3 k=1 The result is :8 when n=16 m=3 k=1 The result is :11 when n=17 m=3 k=1 The result is :14 when n=18 m=3 k=1 The result is :17 when n=19 m=3 k=1 The result is :20 when n=20 m=3 k=1
发表评论
-
排序算法---计数排序
2011-11-27 14:57 602#include <stdio.h> vo ... -
排序算法---归并排序
2011-11-26 19:33 740#include <stdio.h> vo ... -
排序算法---交换排序(冒泡排序、快速排序)
2011-11-26 19:32 699#include <stdio.h> vo ... -
排序算法---选择排序(简单插入排序、堆排序)
2011-11-26 19:31 643#include <stdio.h> vo ... -
排序算法---插入排序(简单排序、shell排序)
2011-11-26 19:29 643#include <stdio.h> vo ... -
删除字符串中的特定字符和重复字符
2011-11-26 13:45 660#include <stdio.h> vo ... -
Linux编程-多线程、同步和互斥(转载)
2011-11-14 15:27 1204http://www.cnblogs.com/skynet/a ... -
寻找字符串中的最大数字子串
2011-09-22 17:17 1513#include <stdio.h> int f ... -
删除子字符串
2011-09-21 15:27 599#include <stdio.h> #incl ... -
c语言随机数
2011-09-18 17:15 682#include <stdio.h> #i ... -
带头结点有序单链表的合并
2011-09-08 14:21 1178typedef int Item; typedef s ... -
链表逆序的递归/非递归算法
2011-09-01 23:37 1404/** *链表逆序的递归/非递归算法 */ # ... -
递归算法---字符串---全/部分组合和全排列
2011-08-30 23:01 1216#include <stdio.h> #i ... -
递归算法---0-1背包问题(面试宝典)
2011-08-28 21:11 1892/** *正整数n,m,从数列1、2、3、...、n中随 ... -
递归算法---字符串全组合(面试宝典)
2011-08-28 17:24 1251/** *求一字符串所有字串的组合 */ #i ... -
递归算法---求解多元一次方程
2011-08-28 10:38 1893/** * 求解x1+x2+x3+...+x10 = ... -
(zz)关于类的sizeof
2011-08-27 18:16 564http://blog.sina.com.cn/s/blog_ ... -
(zz)结构体字节对齐原则
2011-08-27 17:53 1576结构体默认的字节对齐一般满足三个准则: 结构体变量的首 ... -
list.h from linux-2.4
2011-08-25 09:59 602#ifndef _LIST_H_ #define _L ... -
The C Programming Lang (K&R) hash table
2011-08-25 09:52 930hash.h #include <stdio.h ...
相关推荐
Josephus环的问题看起来很简单,假设有n个人排成一个圈。从第一个人开始报数,数到第m个人的时候这个人从队列里出列。然后继续在环里数后面第m个人,让其出列直到所有人都出列。求所有这些人出列的排列顺序。
《简单Josephus环模拟器》是一款基于C#编程语言开发的桌面应用程序,它主要用于模拟经典的Josephus问题。Josephus问题源自一个古老的数学问题,通常在博弈论和计算机科学中被用作教学示例。该问题涉及到在一个封闭的...
代码比较清晰 易懂 规范 找了很多从中挑选出来的
2、 约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m...
Java约瑟夫环(Josephus Problem)是一种著名的理论问题,源于古罗马的传说。在问题中,人们站成一个圈,并按照某种顺序依次剔除,最后剩下的人将获得某种奖励或者幸存。Java编程实现约瑟夫环可以采用递归或非递归的...
#include #include #define NULL 0 #include typedef struct Lnode{ int data; struct Lnode *next; }joseph;
"Josephus环问题"是一个经典的理论问题,源自罗马历史学家Flavius Josephus的一个故事。在问题中,人们围成一个圈,按照某种规则报数,每次数到特定数字的人会被淘汰,直到只剩一人为止。这个问题在计算机科学中被...
Josephus问题可以描述为如下的一个游戏:N个人编号从1到N,围坐成一个圆圈,从1号开始传递一个热土豆,经过M次传递后拿着土豆的人离开圈子,由坐在离开的人的后面的人拿起热土豆继续进行游戏,直到圈子只剩下最后一...
Josephus环的四种解法(约瑟夫环)基于java详解 Josephus环是数学应用问题中的一种经典问题,它的解法有多种,今天我们将通过java代码详细介绍Josephus环的四种解法。 问题描述 Josephus环是一个数学应用问题:已知...
java实现约瑟夫环问题Josephus 约瑟夫问题 * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k(1,2,3...n)的人开始报数,数到m(1,2,3...)的那个人出列; * 他的下一个人又从1开始报数,...
Data Structure 数据结构课,河内环的代码,希望对大家有用!
设有n个人围坐一圈并由1到n编号,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新1到n报数,数到m的人又出列,如此反复地报数和出列,直到最后一个人出列为止,设计确定这n个人出列序列的程序
本课程设计的任务是实现一个约瑟夫环(Josephus problem)问题的解决方案,该问题涉及到一系列个体(本题中为编号从1到n的人)围成一个圆圈,并按照特定规则逐一出列,直到所有个体都已出列为止。 **具体要求**: 1...
单链表解决约瑟夫环问题
一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此...
约瑟夫环,又称约瑟夫问题(Josephus Problem),源自一个古老的传说,它在计算机科学中被用来研究循环链表、递归算法以及组合数学等领域。在这个实习报告中,我们将围绕约瑟夫环的理论、实现和应用进行详尽的探讨。...
用单链表作数据结构实现计算Josephus问题的通用算法。 输入的元素个数为n,从第s个元素开始计数,数到第m个数据出列。
约瑟夫环问题是一个经典的算法问题,也是数据结构中链表操作的一个应用实例。问题起源于一个传说,即犹太历史学家约瑟夫·弗拉维奥在描述一个特定情景时提出的问题。在C++中实现约瑟夫环算法,通常需要借助数组或...
### 约瑟夫环(Josephus)问题详解 #### 一、问题背景与定义 约瑟夫环问题,又称为约瑟夫问题或者约瑟夫斯难题,源自古罗马历史学家弗拉维乌斯·约瑟夫斯的自传。在面对敌人的围攻时,约瑟夫斯和他的40名士兵退守...