约瑟夫环:共有n个人围成一圈,从1开始报数,数到m的人出圈,求最后幸运者序号??
下面用java实现循环列表解决这个问题:
package com.iteye.ljmdbc7a;
import java.util.Scanner;
/**
* 循环列表的Java实现,解决约瑟夫环问题
* @author LIU
*
*/
public class LinkedList
{
//定义结点,必须是static
static class Node
{
int data;
Node next;
Node(int arg1)
{
this.data = arg1;
}
}
public static void main(String[] args)
{
int n = 0,m = 0;//定义总人数n,和出圈数字m
//输入n和m
System.out.println("输入总人数n,出圈数字m");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
//初始化循环列表,头结点first和尾结点p
Node first = new Node(1);
first.next = first;
Node p = first;
for(int i=2; i<=n; i++)
{
Node temp = new Node(i);
temp.next = p;
p.next = temp;
p = p.next;
}
p.next = first;//尾接头形成循环链表(p为尾结点)
//执行出圈操作
System.out.println("出圈顺序为:");
while(p != p.next)
{
//下面for循环后,p是第m个结点的前一个结点
for(int i=1; i<m; i++)
p = p.next;
//删除第m个结点
System.out.print(p.next.data+" ");
p.next = p.next.next;
}
System.out.print("\n幸运者是:"+p.data);
}
}
注意42行->>>>p.next = first;//尾接头形成循环链表(p为尾结点)
分享到:
相关推荐
约瑟夫环问题 Java 实现详解 约瑟夫环问题是一个经典的数学问题,描述如下:有 n 个人围成一圈,从第一个人...了解约瑟夫环问题的 Java 实现可以帮助我们更好地理解递推问题的解决方法,并且可以应用于实际项目中。
两种方法都是基于循环和计数的策略来解决约瑟夫环问题。集合实现更便于元素的添加和删除,而数组实现则更适合直接操作元素值。这两种方法都可以有效地找到约瑟夫环问题的解,但效率上,数组实现可能会稍微快一些,...
1. `JosephusProblem` 类:这是主类,用于初始化问题并调用解决问题的函数。 2. `Person` 类:代表参与约瑟夫环的人,可能包含编号等属性。 3. `removeEveryNth` 函数:这是一个核心函数,用于从列表中移除每N个人,...
Java约瑟夫环(Josephus Problem)是一种经典的理论问题,源于古罗马的一种传说。在编程领域,它通常被用来展示循环、链表操作以及算法设计。在这个Java Applet程序中,我们将探讨如何用Java实现约瑟夫环的算法,并...
Java编程语言是实现约瑟夫问题的常见选择,因为它具有强大的面向对象特性以及丰富的库支持。 在提供的压缩包文件中,我们有三个文件:TestJoseph.java、Ele.java 和 Joseph.java。这些文件可能分别代表测试类、元素...
在Java语言中,约瑟夫环可以通过循环链表来实现。循环链表是一种特殊类型的链表,其中最后一个节点的next指针指向头节点,形成一个闭环。在约瑟夫环问题中,我们首先创建一个包含所有参与者的链表,然后通过迭代的...
约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们围成一个圈,并按顺时针或逆时针顺序报数,每当报到特定数字的人会被移出圈子,然后从下一个...
在这个"joseph-master.zip"压缩包中,很可能包含了不同编程语言或算法实现的约瑟夫环解决方案。 约瑟夫环问题的基本形式是这样的:假设n个人围成一圈,从第一个人开始报数,每报到m的人将被剔除,然后从下一个人...
总的来说,约索夫环问题是一个有趣的组合问题,它展示了数学和计算机科学在解决问题时的巧妙结合,同时也为我们提供了一个研究和实践算法的良好平台。通过理解和解决约索夫环,我们可以深化对递归、链表、数组以及...
问题的核心是模拟一个循环列表,其中的元素(在这里是人)按照特定规则被删除,直到只剩下一个元素为止。 在原始问题中,N个人围成一个圈,并从第一个人开始顺时针报数。每当数到M时,这个人就会被淘汰出局,然后从...
约瑟夫问题,又称为约瑟夫环问题,是一个经典的理论问题,源于古希腊的数学家约瑟夫·弗朗西斯提出的。这个问题通常描述为:假设有一群人围成一个圆圈,从某个人开始计数,每数到特定数值的人就会被排除,然后从下一...
【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...
标题 "test11.9_java_" 暗示...综上所述,解决“约瑟夫环”问题需要理解基本的数据结构、循环控制和条件判断,这都是Java编程的基础知识。通过实现这样的程序,不仅可以锻炼编程技能,也能加深对算法和数据结构的理解。
解决约瑟夫问题的关键在于使用循环链表。首先,我们需要创建一个包含n个节点的环形链表,每个节点代表一个人,其编号为从1到n。然后,我们设置一个指针从k号节点开始,每次移动m-1步,到达的节点将被删除,接着从被...
第十一讲的约瑟夫问题是一个经典的算法问题,通过解决它,学习者可以加深对递归和循环的理解。 第十二讲和第十三讲涉及多态和抽象类、接口。多态是面向对象的重要特性,允许使用父类类型的引用操作子类对象。抽象类...
1. **约瑟夫问题**:这是一个著名的数学问题,涉及到循环链表的使用。在问题描述中,n个人围成一圈,按照顺时针方向从1开始报数,当数到m的人出列,然后从下一个人继续开始报数,直到所有人都出列。这个问题可以通过...
约瑟夫问题是一个经典的算法问题,涉及循环数组和递归,常用于练习和面试。 11. **多态性** 多态性是Java面向对象编程的重要特性,允许子类对象替换父类对象,调用父类方法时执行子类的实现。 12. **接口和抽象...
import java.util.Scanner; class Bissextile{ public static void main(String[] arge){ System.out.print("请输入年份"); int year; //定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in...
解决约瑟夫环问题,通常采用递归或循环数据结构,如链表或数组。在Kotlin中,我们可以使用循环来实现这一算法。首先,我们需要创建一个表示参与者的列表,然后通过一个循环来模拟报数过程。每次报数时,我们会移除...