约瑟夫问题
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后所有人出列为止。输出出列轨迹。
java 实现:
package com.wayfoon.test;
import java.util.LinkedList;
import java.util.List;
/**
* 有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。
* 现在给定一个数N,从第一个人开始依次报数,数到N的人出列,
* 然后又从下一个人开始又从1开始依次报数,
* 数到N的人又出列...如此循环,直到最后所有人出列为止。
* 输出出列轨迹。
* @authorwayfoon
*
*/
public class Tx
{
//存放M
List<String> list = new LinkedList<String>();
//一圈数数完之后,临时存放出列的人
List<String> tmp = new LinkedList<String>();
public Tx(int m)
{
for (int i = 1; i <= m; i++)
{
list.add(i + "");
}
}
/**
* 递归 执行主体
* @param start
* @param n
*/
public void start(int start,int n)
{
int size = list.size();
if (list.size() == 0)
{
System.out.println("结束!!");
return ;
}
for (int i = 1; i <= size; i++)
{
if ((i + start) % n == 0)
{
System.out.println(list.get(i - 1) + " 出局,");
tmp.add(list.get(i - 1));
}
}
//在m中删除临时队列的人
for (String str : tmp)
{
list.remove(str);
}
//清除list
tmp.clear();
//递归
start((size + start) % n,n);
}
public static void main(String[] args)
{
long t1=System.currentTimeMillis();
//M=100
Tx tx = new Tx(100);
//n=7
tx.start(0,7);
System.out.print("花费时间:");
System.out.println(System.currentTimeMillis()-t1);
}
}
执行结果,
7 出局,
14 出局,
21 出局,
28 出局,
35 出局,
42 出局,
49 出局,
56 出局,
63 出局,
70 出局,
77 出局,
84 出局,
91 出局,
98 出局,
5 出局,
13 出局,
22 出局,
30 出局,
38 出局,
46 出局,
54 出局,
62 出局,
71 出局,
79 出局,
87 出局,
95 出局,
3 出局,
12 出局,
23 出局,
32 出局,
41 出局,
51 出局,
60 出局,
69 出局,
80 出局,
89 出局,
99 出局,
9 出局,
19 出局,
31 出局,
43 出局,
53 出局,
65 出局,
75 出局,
86 出局,
97 出局,
10 出局,
24 出局,
36 出局,
48 出局,
61 出局,
74 出局,
88 出局,
1 出局,
16 出局,
29 出局,
45 出局,
59 出局,
76 出局,
92 出局,
6 出局,
25 出局,
40 出局,
58 出局,
78 出局,
94 出局,
15 出局,
34 出局,
55 出局,
73 出局,
96 出局,
18 出局,
44 出局,
67 出局,
90 出局,
17 出局,
47 出局,
72 出局,
2 出局,
33 出局,
66 出局,
100 出局,
37 出局,
81 出局,
11 出局,
57 出局,
4 出局,
52 出局,
8 出局,
68 出局,
27 出局,
93 出局,
83 出局,
82 出局,
85 出局,
26 出局,
64 出局,
20 出局,
39 出局,
50 出局,
结束!!
花费时间:15
网上搜索到的采用c语言,双链表实现,不错
#include<stdio.h>
struct node{
int s;
node* head,*tail;
};
int main()
{
int n,k;scanf("%d%d",&n,&k);
node *Begin,*End,*tem;
Begin=new node;
Begin->head=Begin->tail=NULL;Begin->s=1;
End=Begin;
for (int i=2;i<=n;i++){
tem=new node;
tem->head=End;
tem->s=i;
End->tail=tem;
End=tem;
}
End->tail=Begin;Begin->head=End;
int m=n;
tem=Begin;
while (m>0){
int c=1,p=k%m-1;// p表示要循环多小次
if (p>0){ // 正数表示顺时针 负数表示逆时
if (p>m-(p+2)+2){ // <--比较顺时针快还是逆时针快
p=m-(p+2)+2;
while (c!=p){
c++;tem=tem->head;
}
if (m!=1) printf("%d ",tem->head->s);
else printf("%d\n",tem->head->s);
tem->head->head->tail=tem;
tem->head=tem->head->head;
}else{
while (c!=p){
c++;tem=tem->tail;
}
if (m!=1) printf("%d ",tem->tail->s);
else printf("%d\n",tem->tail->s);
tem->tail->tail->head=tem;
tem->tail=tem->tail->tail;
tem=tem->tail;
}
}else{
p=-p;
if (!p){ // <--特殊处理输出本身
if (m!=1) printf("%d ",tem->s);
else printf("%d\n",tem->s);
tem->head->tail=tem->tail;
tem->tail->head=tem->head;
tem=tem->tail;
}else{
while (c!=p){
c++;tem=tem->head;
}
if (m!=1) printf("%d ",tem->head->s);
else printf("%d\n",tem->head->s);
tem->head->head->tail=tem;
tem->head=tem->head->head;
}
}
m--;
}
return 0;
}
分享到:
相关推荐
约瑟夫问题java语言代码实现 希望对需要的朋友有所帮助
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1 )的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号...
Java语言是实现约瑟夫问题的理想选择,因为其强大的面向对象编程特性、丰富的类库以及高效的执行效率。下面我们将深入探讨如何使用Java来解决这个问题。 1. **问题定义**: - 有n个人围成一个圈,编号为1到n。 - ...
约瑟夫问题源码java版
java实现约瑟夫环问题Josephus 约瑟夫问题 * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k(1,2,3...n)的人开始报数,数到m(1,2,3...)的那个人出列; * 他的下一个人又从1开始报数,...
约瑟夫的简单实现,循环链表。。。写的简单,可以改进的。代码注释还可以吧
约瑟夫问题,通过类实现的链表,并加以改进,做成双向链表
约瑟夫环问题Java代码实现 约瑟夫环问题是一种经典的算法问题,指的是在一个圆形排列的n个人中,每次从1开始报数,凡是报到m的人出局,问最后出局的人是谁。这个问题可以使用Java语言来实现。 约瑟夫环问题的Java...
java解决约瑟夫环问题
约瑟夫环java实现
在Java中实现约瑟夫问题,我们可以利用数据结构,如链表或者数组,来模拟这个过程。链表的节点可以代表人,节点的下一个节点表示报数的顺序。数组则可以用来存储每个人的编号,通过循环遍历实现报数和移除操作。 ...
Java编程语言是实现约瑟夫问题的常见选择,因为它具有强大的面向对象特性以及丰富的库支持。 在提供的压缩包文件中,我们有三个文件:TestJoseph.java、Ele.java 和 Joseph.java。这些文件可能分别代表测试类、元素...
这是一个java的约瑟夫问题代码,实现约瑟夫问题(循环链表)!
约瑟夫环是一个数学的应用问题: ...网上看到很多实现,唯独Java实现不好找,自己构思了一下思路,用递归的方式实现了一个Java版的约瑟夫问题解决方案,代码简洁,思路清晰,请各位同行参考,欢迎交流。
循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释
Java算法中的JOSEPH问题,也称为约瑟夫环问题,是一个经典的理论计算问题,源自古希腊的一个传说。这个问题的基本设定是,有一群人(或猴子,在此例中)围成一个圈,按照顺时针方向从某个人开始报数,数到特定数值的...
在提供的代码实现中,`约瑟夫问题_基于java+双链表实现的约瑟夫问题题解`这个文件很可能是包含了解决约瑟夫问题的Java源代码。这个文件可能包括一个主类,用于设置初始参数(如人数和报数间隔),以及一个辅助类来...
Java 实现史密斯数和约瑟夫环问题代码 在本节中,我们将探讨 Java 实现史密斯数和约瑟夫环问题的代码实现。史密斯数和约瑟夫环问题是经典的编程题目,它们都是基础编程概念的延伸。 首先,让我们来了解一下约瑟夫...
这里的"ysf.java"文件很可能包含了一个使用Java实现的约瑟夫问题解决方案。以下是对该问题的一种可能的Java实现方式: ```java public class Ysf { static class Node { int val; Node next; public Node(int ...
* Java约瑟夫问题: n个人(不同id)围成一个圈,从startId(任意数)个开始报数m(任意数)个数,数m的人出列排成新队列,m清零, * 然后又从下一个人开始数m个数开始,数到m就出列接在新队列尾部,如此重复,知道...